1. 程式人生 > >Lucene查詢語法詳解

Lucene查詢語法詳解

Lucene查詢

Lucene查詢語法以可讀的方式書寫,然後使用JavaCC進行詞法轉換,轉換成機器可識別的查詢。

下面著重介紹下Lucene支援的查詢:

Terms詞語查詢

詞語搜尋,支援 單詞 和 語句。

  • 單詞,例如:"test","hello"
  • 語句,例如:"hello,world!"

多個詞語可以通過操作符,連線成更復雜的搜尋邏輯。

Field欄位查詢

Lucene支援針對某個欄位進行搜尋,語法如:

title:hello
或者
title:"hello title"

搜尋語句時需要加上雙引號,否則:

title:hello title
就意味著,搜尋title為hello,或者包含title關鍵字的文件

Term Modifier修飾符查詢

Lucene支援對詞語增加修飾,從而擴大查詢的範圍。

WildCard Searches萬用字元查詢

支援在單個單詞或者語句中新增萬用字元:

  • ?匹配單個字元
  • *匹配0個或多個字元

例如:

=>想要搜尋test或者text

te?t

=>想要搜尋test  tests  tester

test*

文件中不支援萬用字元放在搜尋的開頭,如*test,但是在kibana中是支援這種搜尋語法的。

Fuzzy Searches模糊詞查詢

支援搜尋模糊詞,如果想要搜尋模糊詞,需要在詞語後面加上符號~

例如:

=>想要搜尋和test相近的詞

test~

可以搜尋出text或者tests等詞

也支援在~後面新增模糊係數,模糊係數[0-1],越靠近1表示越相近,預設模糊係數為0.5。

test~0.8

Proximity Searches鄰近詞查詢

前面的模糊詞只是針對某個單詞,在語句間也存在模糊搜尋的概念,只不過不是單詞的模糊,而是單詞之間內容的模糊。

注意要使用雙引號`""`包圍

例如:

=>想要搜尋包含"hello""world"的文件,這兩個單詞中間可以有一部分內容(這部分內容通過字元個數限制)

"hello world"~10

可以匹配"hello 123 world"
或者"hello,Tom,world"

Range Searches範圍查詢

支援範圍搜尋,可以指定最小值和最大值,會自動查詢在這之間的文件。如果是單詞,則會按照字典順序搜尋。

  • {}尖括號表示不包含最小值和最大值,可以單獨使用
  • []方括號表示包含最小值和最大值,可以單獨使用

例如:

=>搜尋成績grade欄位小於等於80分,大於60分的

grade:{60,80]

=>搜尋名字在A和C之間的

name:{A,C}

返回,bone、baby、barry

Boosting a Term詞語相關度查詢

如果單詞的匹配度很高,一個文件中或者一個欄位中可以匹配多次,那麼可以提升該詞的相關度。使用符號^提高相關度。

例如:

=>提高jarkarta的比重
jakarta apache

可以採用下面的語法:

jakarta^4 apache

Boolean Operator布林操作符

支援多種操作符:

AND

AND操作符用於連線兩個搜尋條件,僅當兩個搜尋條件都滿足時,才認為匹配。通常用來做交集操作。也可以使用&&替換。

注意必須使用大寫。如果不使用AND,而是and,可能會被單做關鍵詞進行搜尋!

例如:

=> 搜尋同時包含tom和john的文件

tom AND john
或者
tom && john

OR

OR操作符用於連線兩個搜尋條件,當其中一個條件滿足時,就認為匹配。通常用來做並集操作。也可以使用||替換。

注意必須使用大寫。

例如:

=>搜尋包含tom或者john的文件

tom OR john
或者
tom || john

NOT

NOT操作符排除某個搜尋條件。通常用來做差集操作也可以使用!替換。

注意必須大寫。

例如:

=>搜尋包含tom,不包含john的文件

tom NOT john
或者
tom && !john

在kibana中支援單獨使用,如:

=>排除包含test的文件

NOT test

+

包含該操作符後跟著的搜尋條件,如:

=>搜尋包含tom的文件

+tom

作用於AND的差不多,但是支援單獨使用

-

排除該操作符後跟著的搜尋條件,如:

=>搜尋不包含tom的文件

-tom

效果類似NOT

Grouping分組

支援使用小括號對每個子句進行分組,形成更為複雜的查詢邏輯。

例如:

=>要搜尋包含hello的文件中,也包含tom或者john的

hello AND (tom OR john)

也支援在欄位中使用小括號:

=>要搜尋標題中,既包含return 也包含pink panther的

title:(+return +"pink panther")

Escaping Special Character轉義字元

由於Lucene中支援很多的符號,如

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

因此如果需要搜尋 (1+1):2 需要對改串進行轉換,使用字元\

\(1\+1\)\:2