全文檢索Lucence(五) 查詢

2021-06-22 13:53:02 字數 3781 閱讀 8995

一、簡單概要:

無論是分詞器、索引(索引庫、索引表、資料)等都是為最終的索引做服務,個人覺得這張圖特別重要:

這張圖展示了lucence工作原理的最核心部分:

建立索引庫(由索引表和資料組成)。

索引表:是對文件集合的乙個索引,建立索引使用的是分詞器,而且將來搜尋的時候,也使用同乙個分詞器物件。文件集合內部,lucence會自動維護乙個文件內容編號,它相當於hibernate對映實體的自增主鍵。

通過分詞器可以建立並維護索引表,維護索引的時候,一般採用先刪除後增加的方法來迴避更新帶來的效能問題。

二、關於查詢:

模擬hibernate,lucence查詢分為:查詢語句和物件查詢兩種查詢方式。如果使用查詢語句,一般也會在程式中將查詢條件進一步封裝成查詢物件。

1、查詢語句:

queryparser物件,以查詢內容字串和查詢欄位為引數,將兩者解析成query物件,indexsearcher物件以query物件為引數進行查詢。

前面的文章中都使用了這種查詢:

/**

* 搜尋

* * indexsearcher 是用來在索引庫中進行查詢的

*/@test

public void search() throws exception ;

queryparser queryparser = new multifieldqueryparser(fields, analyzer);

query query = queryparser.parse(querystring);

// 2,進行查詢

indexsearcher indexsearcher = new indexsearcher(indexpath);

filter filter = null;

topdocs topdocs = indexsearcher.search(query, filter, 10000);

system.out.println("總共有【" + topdocs.totalhits + "】條匹配結果");

// 3,列印結果

for (scoredoc scoredoc : topdocs.scoredocs)

}

下面是增加了不同字段權重和分頁的字串查詢:

public queryresult search(string querystring, int firstresult, int maxresults) ;

//表示權重:標題和內容中出現關鍵字的得分不一樣,在標題中出現時的得分理應高些

mapboosts = new hashmap();

boosts.put("name", 3f);

// boosts.put("content", 1.0f); 預設為1.0f

queryparser queryparser = new multifieldqueryparser(fields, analyzer, boosts);

query query = queryparser.parse(querystring);

return search(query, firstresult, maxresults);

} catch (exception e)

}

如:對上面的封裝的呼叫:

public void testquerystring() 

}}

2、查詢物件:物件查詢的封裝:

public queryresult search(query query, int firstresult, int maxresults) 

doc.getfield("content").setvalue(hc);

// **********=

recordlist.add(doc);

}// 返回結果

return new queryresult(recordcount, recordlist);

} catch (exception e) finally catch (ioexception e)

} }

關於高亮、分頁、排序後續介紹。

/**

* * name:room

*/@test

public void testtermquery()

2.rangequery範圍查詢:是否包括邊界

/**

* 範圍查詢

* * 包含邊界:size:[0000000000001e to 000000000000rs]

* * 不包含邊界:size:

*/@test

public void testrangequery()

3.wildcardquery 萬用字元查詢:'?' 代表乙個字元, '*' 代表0個或多個字元

/**

* 萬用字元查詢

* * '?' 代表乙個字元, '*' 代表0個或多個字元

* name:房*

* name:*o*

* name:roo?

*/@test

public void testwildcardquery()

4.phrasequery 短語查詢:

/**

* 短語查詢

* * content:"? 紳士 ? ? 飯店"

* * content:"紳士 飯店"~2

*/@test

public void testphrasequery()

5.booleanquery 組合查詢:

/**

* +content:"紳士 飯店"~2 -size:[000000000000dw to 000000000000rs]

* +content:"紳士 飯店"~2 +size:[000000000000dw to 000000000000rs]

* content:"紳士 飯店"~2 size:[000000000000dw to 000000000000rs]

* +content:"紳士 飯店"~2 size:[000000000000dw to 000000000000rs]

*/@test

public void testbooleanquery()

ps:  queryandprintresult對查詢和結果的封裝:

public void queryandprintresult(query query) 

}

總結:查詢是lucence的核心,上面的文章對索引的增刪改做了封裝,這裡重點解釋了lucence的基於索引的查詢,以及不同的查詢策略的**實現。

這裡重點是解釋查詢對高亮、排序、權重值、分頁、string、long型別的轉換等沒有做過多的解釋,後續的部落格中會做補充性解釋,內容中如有不對的地方,歡迎拍磚。

什麼叫全文檢索 全文檢索概念

全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...

什麼叫全文檢索 全文檢索概念

全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...

MSSQL全文檢索

大家可能都會用 select from tb where field like 關鍵字 但是一旦資料量大使用者多,就會造成查詢過慢,因此ms提供一種犧牲空間來換取時間的解決方案。全文檢索。原文請看 我對自己的實現加了些注釋 use popask 使用這個庫 exec sp fulltext data...