在 lucene中的 常用的Query

2021-08-25 14:41:49 字數 2576 閱讀 8250

query介面的物件是查詢規則條件物件,它有很多子實現,不同的實現物件有著不同的規則。

下面列出幾個主要的規則:

//各種搜尋
@test
public void testsearchbyquery() throws exception 1
//2.詞條精確匹配查詢
query query=new termquery(new term("content","乙個"));
關鍵字必須精確匹配詞條中的值!

//3.萬用字元匹配查詢
query query=new wildcardquery(new term("content","*個*"));
//4.模糊(相似度)查詢,
//相似度距離(容納錯誤的字元數量),值:0-2,預設值2;如果是0,則和詞條精確匹配一樣的效果,單詞字串數量相同
//        query query=new fuzzyquery(new term("content","gaod"));
query query=new fuzzyquery(new term("content","gaod"),1);
//5.字元範圍查詢
//先安長度比,再按字元比
//引數1:字段,引數2:最小值,引數3:最大值,引數4:是否包含下邊界,引數5:是否包含上邊界
query query= termrangequery.newstringrange("id", "100", "1000",true,true);
//6. 先分詞再搜尋
//建立查詢解析器
//引數1:要查詢的字段的名字,必須有才行
//引數2:分詞器,在查詢的時候,先將關鍵字分詞,再搜尋
queryparser queryparser=new queryparser("content",new smartchineseanalyzer());
//對要查詢的關鍵字進行解析分析後,獲取查詢物件
query query = queryparser.parse("乙個壞人");
實際搜尋的時候,可能需要多個規則配合使用。該物件將這些規則組合到一起。

//7.組合查詢
//兩個查詢條件物件示例
query query1=new termquery(new term("content","乙個"));
query query2=new termquery(new term("content","不存在"));
//建立組合查詢物件
booleanquery query=new booleanquery.builder()
.add(query1, booleanclause.occur.should)
.add(query2, booleanclause.occur.should)
.build();
三個關係規則:

常見組合:

各種組合參考:

1、must和must表示「與」的關係,即「交集」。2、must和must_not前者包含後者不包含。3、must_not和must_not沒意義4、should與must表示must,should失去意義;5、should與must_not相當於must與must_not。6、should與should表示「或」的概念。

【擴充套件】

lucene6去掉了filter但是可以用booleanquery實現filter查詢。

filter查詢的的好處在於對結果過濾,但不會影響到打分,這個和上面其他的各種查詢有明顯的區別。

如:

//booleanquery 中使用filter查詢也可以讓該部分的查詢結果不參與打分
builder.add(termquery, booleanclause.occur.filter);
builder.add(termquery1, booleanclause.occur.filter);
//修改
@test
public void testupdate() throws exception
注意:

a:lucene修改功能的底層實現是會先刪除,再把新的文件新增。

b:修改功能會根據term進行匹配,所有匹配到的都會被刪除。這樣不好

c:因此,一般我們修改時,都會根據乙個唯一不重複字段進行匹配修改。例如id

d:詞條搜尋的條件中,要求值必須是字串。如果不是,這個方法就不能用,更新會變成新增效果。如果id是數值型別,我們不能直接去修改。可以先手動刪除deletedocuments(數值範圍查詢鎖定id),再新增。

e:如果修改的文件部分欄位為空,則更新後的文件的這些欄位也會為空

lucene 中的TooManyClause 異常

使用lucene檢索過程中如果用到rangequery,prefixquery,wildcardquery,fuzzyquery等query的時候,可能會產生 toomanyclauses異常。為什麼呢?以 rangequery為例,如果日期範圍為 19990101到 20091231,在索引檔案中...

lucene中的刪除索引

今天在測試lucene的刪除索引中遇到乙個問題 測試 如下 protected void setup throws exception public void testdeleteindex throws exception 在測試中,首先重建索引 見setup方法 在測試方法中可以看出 1 刪除前...

lucene中的刪除索引

今天在測試lucene的刪除索引中遇到乙個問題 測試 如下 protected void setup throws exception public void testdeleteindex throws exception 在測試中,首先重建索引 見setup方法 在測試方法中可以看出 1 刪除前...