理解Lucene中的Query

2021-09-08 12:31:26 字數 1855 閱讀 7122

query是乙個介面,它有很多實現類。

queryparser是query解析器,用於將乙個字串解析為乙個query物件,這個query物件可能屬於termquery,也可能屬於phrasequery、termquery、booleanquery等。可以通過query物件的getclass()方法來檢視這個物件到底是哪個實現類。

lucene已經給我們提供了很多query查詢器,如phrasequery,spanquery那為什麼還要提供queryparser呢?或者說設計queryparser的目的是什麼?queryparser的目的就是讓你從眾多的query實現類中脫離出來,因為query實現類太多了,你有時候會茫然了,我到底該使用哪個query實現類來完成我的查詢需求呢,所以lucene制定了一套query語法,根據你傳入的query語法字串幫你把它轉換成query物件,你不用關心底層是使用什麼query實現類。

query是乙個抽象類,它的子孫包括:

term就是乙個「鍵」。

lucene基本原理就是倒排索引,而倒排索引實際上相當於一種雜湊。這種雜湊需要鍵,在英語中鍵是單詞,在漢語中鍵是分詞之後的詞語(也就是token)。

term查詢的就是包含單個詞語的文章。

如果把「我愛中國」作為termquery來查詢,那麼結果很可能為null,因為「我愛中國」不是乙個詞語,建立索引時,沒有把「我愛中國」作為鍵。

termquery只能查詢固定的term,prefixquery可以查詢多個term,這些term的字首都是相同的。

public void add(query query, boolean required, boolean prohibited);

required表示必須滿足query,prohibited表示必須不滿足query

二者組合有4中情況:

true,true:不可能出現這種情況

true,false:必須滿足

false,true:必須不滿足

false,false:滿足不滿足都可以

由於布林型的查詢是可以巢狀的,因此可以表示多種條件下的組合。不過,如果子句的數目太多,可能會導致查詢效率的降低。因此,lucene給出了乙個預設的限制,就是布林型query的子句數目不能超過1024。

它需要引數begin和end,這兩個引數都是term型別的。

standardanalyzer analyzer = new standardanalyzer();

multifieldqueryparser q = new multifieldqueryparser(new string , analyzer);

這些個term是近似連續的。

可以設定slop引數來放鬆限制,slop表示的是編輯距離。

只能模糊化查詢乙個term

spanquery是乙個抽象類,它包含了單詞的位置資訊、長度資訊。

由spanquery衍生出的一系列query:

spantermquery:詞距查詢的基礎,結果和termquery相似,只不過是增加了查詢結果中單詞的距離資訊。

spanfirstquery:在指定距離可以找到第乙個單詞的查詢。

spannearquery:查詢的幾個語句之間保持者一定的距離。

spanorquery:同時查詢幾個詞句查詢。

spannotquery:從乙個詞距查詢結果中,去除乙個詞距查詢。

spanquery位於search.span包下

在 lucene中的 常用的Query

query介面的物件是查詢規則條件物件,它有很多子實現,不同的實現物件有著不同的規則。下面列出幾個主要的規則 各種搜尋 testpublic void testsearchbyquery throws exception 1 2.詞條精確匹配查詢query query new termquery n...

Lucene的Query類介紹

把lucene的查詢當成sql的查詢,也許會籠統的明白些query的真相了。查詢分為大致兩類,1 精準查詢。2,模糊查詢。建立測試資料。private directory directory private indexreader reader private string ids private ...

lucene當中的各種query(二)

multiphrasequery 實現以下功能 字首搜尋 indexsearcher searcher new indexsearcher index store path multiphrasequery query new multiphrasequery query.add new term ...