Lucene筆記22-Lucene的使用-Filter
阿新 • • 發佈:2018-11-04
一、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);