- 自己動手寫分布式搜索引擎
- 羅剛
- 372字
- 2020-11-28 15:52:50
3.3.10 使用Filter篩選搜索結果
可以定義Filter類過濾查詢結果,也可以緩存和重用Filter。如下條件可用Filter來實現:
● 根據不同的安全權限顯示搜索結果。
● 僅查看上個月的數據。
● 在某個類別中查找,例如在分類統計查詢中,根據分類列的有效取值縮小查詢范圍。
Filter返回一個DocIdSet,其中包含符合條件的文檔編號。DocIdSet是一個存儲文檔編號的集合。例如:
IndexReader reader= … OpenBitSet bitSet = new OpenBitSet(reader.maxDoc()); // 假設所有的文檔都不在集合內 bitSet.set( 0 ); //讓第一個文檔在集合內
Filter過濾整個索引,得到DocIdSet。
public abstract class Filter implements java.io.Serializable { public abstract DocIdSet getDocIdSet(IndexReader reader) throws IOException; }
下面定義一個BestDriversFilter,把搜索結果限定到score是5的司機。
public class BestDriversFilter extends Filter{ @Override public DocIdSet getDocIdSet(IndexReader reader) throws IOException { OpenBitSet bitSet = new OpenBitSet( reader.maxDoc() ); //查詢出score是5的文檔 TermDocs termDocs = reader.termDocs( new Term( "score", "5" ) ); while ( termDocs.next() ) { bitSet.set( termDocs.doc() ); // 把符合條件的文檔對應的位置設為1 } return bitSet; } }
在查詢中使用這個Filter:
Hits h = searcher.search(tq, filter);
完整的代碼:
Filter bestDriversFilter = new BestDriversFilter(); //query不變,增加bestDriversFilter ScoreDoc[] hits = isearcher.search(query, bestDriversFilter, 10).scoreDocs; //因為不是每個司機都能得5分,所以返回的結果可能比以前少了
推薦閱讀
- UG NX10.0從新手到高手
- ANSYS19.0實例詳解
- Creo 6.0快速入門、進階與精通(升級版)
- 超簡單的攝影后期書
- Getting Started With Oracle SOA Suite 11g R1 – A Hands/On Tutorial
- Premiere視頻編輯應用教程:PremierePro 2020(微課版)
- Maya 2020基礎教材
- 說服力:工作型PPT該這樣做(第2版)
- 巧學巧用Flash CS6制作動畫
- Backbone.js Cookbook
- Joomla! with Flash
- Oracle BI Publisher 11g: A Practical Guide to Enterprise Reporting
- 中文版Premiere Pro 2022基礎教程
- 剪映專業版:PC端短視頻制作(全彩慕課版)
- PPT設計從入門到精通