官术网_书友最值得收藏!

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分,所以返回的結果可能比以前少了
主站蜘蛛池模板: 平安县| 临潭县| 邹平县| 亚东县| 五莲县| 房山区| 肥西县| 剑阁县| 鄂托克旗| 望奎县| 沂源县| 泰来县| 镇安县| 祁连县| 巧家县| 东丽区| 平安县| SHOW| 江孜县| 惠水县| 松溪县| 云霄县| 衡阳县| 桃江县| 揭西县| 泸水县| 延寿县| 宾阳县| 临汾市| 淅川县| 西吉县| 盘锦市| 会昌县| 乌什县| 扶风县| 盐山县| 辉南县| 上思县| 宿州市| 浑源县| 四子王旗|