Lucene查詢語法

譯自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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章