一、簡單概要:
無論是分詞器、索引(索引庫、索引表、資料)等都是為最終的索引做服務,個人覺得這張圖特別重要:
這張圖展示了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)
}
2、查詢物件:物件查詢的封裝:public void testquerystring()
}}
關於高亮、分頁、排序後續介紹。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)
} }
2.rangequery範圍查詢:是否包括邊界/**
* * name:room
*/@test
public void testtermquery()
3.wildcardquery 萬用字元查詢:'?' 代表乙個字元, '*' 代表0個或多個字元/**
* 範圍查詢
* * 包含邊界:size:[0000000000001e to 000000000000rs]
* * 不包含邊界:size:
*/@test
public void testrangequery()
4.phrasequery 短語查詢:/**
* 萬用字元查詢
* * '?' 代表乙個字元, '*' 代表0個或多個字元
* name:房*
* name:*o*
* name:roo?
*/@test
public void testwildcardquery()
5.booleanquery 組合查詢:/**
* 短語查詢
* * content:"? 紳士 ? ? 飯店"
* * content:"紳士 飯店"~2
*/@test
public void testphrasequery()
ps: queryandprintresult對查詢和結果的封裝:/**
* +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()
總結:查詢是lucence的核心,上面的文章對索引的增刪改做了封裝,這裡重點解釋了lucence的基於索引的查詢,以及不同的查詢策略的**實現。public void queryandprintresult(query query)
}
這裡重點是解釋查詢對高亮、排序、權重值、分頁、string、long型別的轉換等沒有做過多的解釋,後續的部落格中會做補充性解釋,內容中如有不對的地方,歡迎拍磚。
什麼叫全文檢索 全文檢索概念
全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...
什麼叫全文檢索 全文檢索概念
全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...
MSSQL全文檢索
大家可能都會用 select from tb where field like 關鍵字 但是一旦資料量大使用者多,就會造成查詢過慢,因此ms提供一種犧牲空間來換取時間的解決方案。全文檢索。原文請看 我對自己的實現加了些注釋 use popask 使用這個庫 exec sp fulltext data...