Lucene查詢語法

2021-09-01 19:28:14 字數 3164 閱讀 3379

一、模糊查詢

term modifiers

lucene支援在term中使用萬用字元來支援模糊查詢。

wildcard searches [類:org.apache.lucene.search.wildcardquery]

lucene支援單個或者多個字元的萬用字元查詢,匹配單一字元使用符號「?」,匹配多個字元使用符號「*」。

「?」萬用字元將查詢所有滿足通過乙個字元替換後符合條件的文件。比如:搜尋「test」和「text」你可以使用:

te?t

「*」萬用字元將查詢0個或者多個字元替換後符合條件的。舉例來說,查詢test,tests或者tester,你可以使用一下字串來搜尋:

test*

當然,你也可以將「*」放在字元的中間

te*t

注意:你不能將「*」和「?」放在第乙個字元來查詢。(lucene應該是出於效能考慮,所以不支援該功能)

fuzzy searches [org.apache.lucene.search.fuzzyquery]

roam~

該查詢將尋找類似「foam」和「roams」等的詞語。也可以說是相似度查詢。

proximity searches [org.apache.lucene.search.prefixquery]

lucene支援指定距離查詢,你可以使用波浪號「~」加數字在查詢詞後。舉例來說搜尋「apache」和「jakarta」距離10個字元以內,你可以使用如下語法:

"jakarta apache"~10

通過這個語法支援,我們可以單字索引,分詞查詢,分詞完後,滿足每個詞的單字必須間距為1。這樣可以保證100%的召回率,但是在索引方面將造成索引臃腫,同時查詢速度也將在某程度上降低,一般來說,在150w文章資料到200w資料的時候效能將會明顯的降低。

range searches [org.apache.lucene.search.rangequery]

範圍查詢允許你指定某個字段最大值和最小值,查詢在二者之間的所有文件。範圍查詢可以包含或者不包含最大值和最小值,排序是按照字典順序來排序的。

mod_date:[20020101 to 20030101]

這個將查詢滿足mode_date欄位在大於等於20020101,小於等於20030101範圍的所有文件,注意:範圍查詢並不是為日期字段專設的,你也可以對非日期字段進行範圍查詢。

title:

這個將查詢所有標題在aida和carmen之間但不包含aida和carmen的文件。包含最大值和最小值的查詢使用方括號,排除則使用花括號。

二、優先順序

boosting a term

lucene支援給不同的查詢詞設定不同的權重。設定權重使用「^」符號,將「^」放於查詢詞的尾部,同時跟上權重值,權重因子越大,該詞越重要。設定權重允許你通過給不同的查詢詞設定不同的權重來影響文件的相關性,假如你在搜尋:

jakarta apache

如果你認為「jakarta」在查詢時中更加重要,你可以使用如下語法:

jakarta^4 apache

"jakarta apache"^4 "jakarta lucene"

在預設情況下,權重因子為1,當然權重因子也可以小於1。

三、term操作符

boolean operators

布林操作符可以將多個term合併為乙個複雜的邏輯查詢。lucene支援and,

+,or,not, -作為操作符號。注意,所有的符號必須為大寫。

oror操作符預設的連線操作符。這意味著,當沒有給多個term顯式指定操作符時,將使用or,只要其中乙個term含有,則可以查詢出文件,這跟邏輯符 號||的意思相似。假設我們查詢乙個文件含有「jakarta apache」或者「jakarta」時,我們可以使用如下語法:

"jakarta apache" jakarta

或者"jakarta apache" or jakarta

andand操作符規定必須所有的term都出現才能滿足查詢條件,這跟邏輯符號&&意思相似。如果我們要搜尋乙個文件中同時含有「jakarta apache」和「jakarta lucene」,我們可以使用如下語法:

"jakarta apache" and "jakarta lucene"

++操作符規定在其後的term必須出現在文件中,也就是查詢詞中的must屬性。舉個例子來說,當我們要查詢乙個文件必須包含「jakarta」,同時可以包含也可以不包含「lucene」時,我們可以使用如下語法:

+jakarta apache

notnot操作符規定查詢的文件必須不包含not之後的term,這跟邏輯符號中的!相似。當我們要搜尋一篇文件中必須含有「jakarta apache」同時不能含有「jakarta lucene」時,我們可以使用如下查詢;

"jakarta apache" not "jakarta lucene"

注意:not操作符不能使用在單獨term中,舉例來說,以下查詢將返回無結果:

not "jakarta apache"

--操作符排除了包含其後term的文件,跟not有點類似,假設我們要搜尋「jakarta apache」但不包含「jakarta lucene」時,我們使用如下語法:

"jakarta apache" -"jakarta lucene"

grouping

lucene支援使用圓括號來將查詢表示式分組,這將在控制布林控制查詢中非常有用。舉例來說:當搜尋必須含有「website」,另外必須含有「jakarta」和「apache」之一,我們可以用如下語法:

(jakarta or apache) and website

這種語法對消除歧義,確保查詢表示式的正確性具有很大的意義。

field grouping

lucene支援對字段用圓括號來進行分組,當我們要查詢標題中含有「return」和「pink ranther」時,我們可以使用如下語法:

title:(+return +"pink panther")

escaping special characters

lucene支援轉義查詢中的特殊字元,以下是lucene的特殊字元清單:

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

轉義特殊字元我們可以使用符號「\」放於字元之前。比如我們要搜尋(1+1):2,我們可以使用如下語法:

\(1\+1\)\:2

tips: queryparser.escape(q) 可轉換q中含有查詢關鍵字的字元!如:* ,? 等

Lucene分頁查詢

個人認為最好每一次分頁導航都執行一次新的 查詢。color red lucene舊版本中常用方法 color hits中儲存的並不是真正的document,因此可以通過hits.doc index 的方式取出在一定範圍內的document。在獲 得hits後可以用類似下面的方法進行分頁處理 priv...

lucene多欄位查詢

booleanquery typenegativesearch new booleanquery queryparser parser new queryparser contents new analyzer parser.setdefaultoperator queryparser.and op...

lucene多欄位查詢

我的例子就是2.0的,現在給你的是兩個域,你可以用n個域 booleanquery typenegativesearch new booleanquery queryparser parser new queryparser contents new analyzer parser.setdefau...