1. 程式人生 > >Lucene筆記22-Lucene的使用-Filter

Lucene筆記22-Lucene的使用-Filter

一、Filter應用場景

假如有人搜尋了一個關鍵詞,通過Lucene查出來了所有的文件,讀者比較關心最新的一些內容,因此需要將某些內容過濾掉。只顯示使用者敏感的文件資料即可。這就要用到過濾器。

二、程式碼演示

public void filter(String queryString, Filter filter) {
    try {
        IndexSearcher indexSearcher = getIndexSearcher();
        QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));
        Query query = queryParser.parse(queryString);
        TopDocs topDocs;
        if (filter != null) {
            topDocs = indexSearcher.search(query, filter, 50);
        } else {
            topDocs = indexSearcher.search(query, 50);
        }
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (ScoreDoc scoreDoc : scoreDocs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            // 依次輸出文件id,文件得分,文件名字,文件路徑,文件大小,文件修改時間
            System.out.println(scoreDoc.doc + "-->" + scoreDoc.score + "-->" + document.get("fileName") + "-->" + document.get("path") + "-->" + document.get("size") + "-->" + simpleDateFormat.format(new Date(Long.valueOf(document.get("date")))));
        }
        indexSearcher.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

這裡演示3個比價常用的過濾器:字串過濾器,數字過濾器,包裝查詢過濾器。還有更高階的過濾器,這裡先不涉及了,感興趣的可以查一下Collector。

CustomSortTest customSortTest = new CustomSortTest();
// 字串過濾
System.out.println("字串過濾");
Filter termRangeFilter = new TermRangeFilter("fileName", "CHANGE.txt", "README.txt", true, true);
customSortTest.filter("java", termRangeFilter);
// 數字過濾
System.out.println("數字過濾");
Filter numericRangeFilter = NumericRangeFilter.newIntRange("size", 500, 900, true, true);
customSortTest.filter("java", numericRangeFilter);
// 包裝查詢過濾器,可以包裝一個query
System.out.println("包裝查詢過濾器");
Filter queryWrapperFilter = new QueryWrapperFilter(new WildcardQuery(new Term("fileName", "*.txt")));
customSortTest.filter("java", queryWrapperFilter);