kibanna用的是lucene的搜索規則
Lucene所支持的查詢語法可見http://lucene.apache.org/java/3_0_1/queryparsersyntax.html
(1) 語法關鍵字
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
如果所要查詢的查詢詞中本身包含關鍵字,則需要用\進行轉義
(2) 查詢詞(Term)
Lucene支持兩種查詢詞,一種是單一查詢詞,如"hello",一種是詞組(phrase),如"hello world"。
(3) 查詢域(Field)
在查詢語句中,可以指定從哪個域中尋找查詢詞,如果不指定,則從默認域中查找。
查詢域和查詢詞之間用:分隔,如title:"Do it right"。
:僅對緊跟其後的查詢詞起作用,如果title:Do it right,則僅表示在title中查詢Do,而it right要在默認域中查詢。
(4) 通配符查詢(Wildcard)
支持兩種通配符:?表示一個字符,*表示多個字符。
通配符可以出現在查詢詞的中間或者末尾,如te?t,test*,te*t,但決不能出現在開始,如*test,?test。
(5) 模糊查詢(Fuzzy)
模糊查詢的算法是基於Levenshtein Distance,也即當兩個詞的差別小於某個比例的時候,就算匹配,如roam~0.8,即表示差別小於0.2,相似度大於0.8纔算匹配。
(6) 臨近查詢(Proximity)
在詞組後面跟隨~10,表示詞組中的多個詞之間的距離之和不超過10,則滿足查詢。
所謂詞之間的距離,即查詢詞組中詞爲滿足和目標詞組相同的最小移動次數。
如索引中有詞組"apple boy cat"。
如果查詢詞爲"apple boy cat"~0,則匹配。
如果查詢詞爲"boy apple cat"~2,距離設爲2方能匹配,設爲1則不能匹配。
(0) |
boy |
apple |
cat |
(1) |
boy apple |
cat |
|
(2) |
apple |
boy |
cat |
如果查詢詞爲"cat boy apple"~4,距離設爲4方能匹配。
(0) |
cat |
boy |
apple |
(1) |
cat boy |
apple |
|
(2) |
boy |
cat apple |
|
(3) |
boy apple |
cat |
|
(4) |
apple |
boy |
cat |
(7) 區間查詢(Range)
區間查詢包含兩種,一種是包含邊界,用[A TO B]指定,一種是不包含邊界,用{A TO B}指定。
如date:[20020101 TO 20030101],當然區間查詢不僅僅用於時間,如title:{Aida TO Carmen}
(8) 增加一個查詢詞的權重(Boost)
可以在查詢詞後面加^N來設定此查詢詞的權重,默認是1,如果N大於1,則說明此查詢詞更重要,如果N小於1,則說明此查詢詞更不重要。
如jakarta^4 apache,"jakarta apache"^4 "Apache Lucene"
(9) 布爾操作符
布爾操作符包括連接符,如AND,OR,和修飾符,如NOT,+,-。
默認狀態下,空格被認爲是OR的關係,QueryParser.setDefaultOperator(Operator.AND)設置爲空格爲AND。
+表示一個查詢語句是必須滿足的(required),NOT和-表示一個查詢語句是不能滿足的(prohibited)。
(10) 組合
可以用括號,將查詢語句進行組合,從而設定優先級。
如(jakarta OR apache) AND website
Lucene的查詢語法是由QueryParser來進行解析,從而生成查詢對象的。
通過編譯原理我們知道,解析一個語法表達式,需要經過詞法分析和語法分析的過程,也即需要詞法分析器和語法分析器。
QueryParser是通過JavaCC來生成詞法分析器和語法分析器的。