譯自http://www.lucenetutorial.com/lucene-query-syntax.html
Lucene有其慣用的查詢語法對其索引進行查詢。下面用一些例子來說明其查詢語法。
關鍵字匹配
檢索條件爲在title字段中包含“foo”
title:foo
檢索條件爲在title字段中包含短語“foo bar”
title:"foo bar"
檢索條件爲title字段中包含短語“foo bar”,並且body字段中包含短語“quick fox”
title:"foo bar" AND body:"quick fox"
檢索條件爲title字段中包含“foo bar”並且body字段中包含短語“quick fox”,或者title字段中包含“fox”
(title:"foo bar" AND body:"quick fox") OR title:fox
檢索條件爲title中包含“foo”但不包含“bar”
title:foo -title:bar
通配符匹配
檢索條件爲title字段以“foo”開頭
title:foo*
檢索條件爲title字段以“foo”開頭並且以“bar”結尾
title:foo*bar
注意Lucene不支持以“*”符號作爲檢索的首字符
距離匹配
Lucene支持檢索詞中包含一個特定距離。(注:距離的計算標準是Damerau–Levenshtein距離,與編輯距離類似,在編輯距離基礎上有一定改進)
例如,檢索條件爲包含“foo bar”並且兩者之間間隔4個詞的距離。
“foo bar”~4
注意對於距離檢索,準確的匹配表示距離爲0,詞互換表示距離爲1。
“foo bar”~10000000 是“foo AND bar”的一種有趣的替代形式。
當query等效地檢索到多個document時,距離匹配會給“foo”和“bar”的距離更爲接近的document賦予更高的分數排名。
距離匹配的代價是性能較慢並且佔用較多的CPU。
Solr的DisMax和eDisMax查詢分析器可以爲用戶query添加距離匹配。
範圍查詢
範圍查詢支持該種查詢,field值在Range Query給定的上下邊界之間的document能夠被匹配到。
Range Query可以包含也可以不包含邊界值。結果按字典序排序。
mod_date:[20020101 TO 20030101]
Solr內建的字段類型無需填充就可以方便的用於數字的Range Query。
Boost
查詢時boost允許用戶指定哪個檢索條目“更加重要”。boost因子值越高,檢索條目就越相關,與該條目相關的document分數就越高。
boost技術的典型場景是給title字段的匹配比body字段更高的boost值,如下
(title:foo OR title:bar)^1.5 (body:foo OR body:bar)
你應該認真檢查解釋輸出來決定正確的boost權重。
關於查詢解析語法的官方文檔請參考:
http://lucene.apache.org/java/3_5_0/queryparsersyntax.html
查詢語法從Lucene3.1之後沒有很大的變化。(現在是3.5.0)
解析查詢
一個query可以通過構造一個QueryParser對象並調用parse()方法來進行解析。
String querystr = args.length > 0 ? args[0] : "lucene";Query q = new QueryParser(Version.LUCENE_CURRENT, "title", analyzer).parse(querystr);
編程方式構建查詢
Lucene的query也可以以編程方式來構建。這種方式在某些情況下是非常方便的。
3.4.0提供的query對象包括
BooleanQuery
ConstantScoreQuery
CustomScoreQuery
DisjunctionMaxQuery
FilteredQuery
MatchAllDocsQuery
MultiPhraseQuery
MultiTermQuery
PhraseQuery
RangeQuery
SpanQuery
TermQuery
ValueSourceQuery
BooleanQuery對象用於連接和嵌套多個query。
這些classes對象時 org.apache.lucene.search package的部分。
下面是一個簡單的示例
String str = "foo bar"; String id = "123456"; BooleanQuery bq = new BooleanQuery(); Query query = qp.parse(str); bq.add(query, BooleanClause.Occur.MUST); bq.add(new TermQuery(new Term("id", id), BooleanClause.Occur.MUST_NOT);