[英]Lucene: Filtering for documents NOT containing a Term
我有一個索引,其文檔有兩個字段(實際上更像是800個字段,但其他字段在這里與我們無關):
contents
字段包含文檔的分析/標記化文本。 在此字段中搜索查詢字符串。 category
字段包含文檔的單個類別標識符。 大約有2500個不同的類別,一個文檔可能出現在多個category
(即,一個文檔可能具有多個category
條目。結果由該字段過濾)。 該索引包含約20 mio。 文檔,大小為5 GB。
使用用戶提供的查詢字符串以及用戶不感興趣的幾個類別的可選集合來查詢索引。 問題是 :如何刪除不僅與查詢字符串匹配而且與不需要的類別匹配的文檔。
我可以用一個BooleanQuery
與MUST_NOT
條款,即是這樣的:
BooleanQuery q = new BooleanQuery();
q.add(contentQuery, BooleanClause.MUST);
for (String unwanted: unwantedCategories) {
q.add(new TermsQuery(new Term("category", unwanted), BooleanClause.MUST_NOT);
}
有沒有辦法用Lucene過濾器做到這一點? 性能在這里是一個問題,並且只會出現一些unwantedCategories
的CachingWrapperFilter
重復出現,因此CachingWrapperFilter
可能會有所幫助。 同樣,由於在現有代碼庫中生成Lucene查詢的方式,很難適應這種情況,而可以輕松引入額外的Filter
。
換句話說, 如何根據文檔中必須出現的術語創建Filter
?
一個字的答案: BooleanFilter
,在提出問題的幾分鍾后找到了它:
BooleanFilter f = new BooleanFilter();
for (String unwanted: unwantedCategories) {
TermsFilter tf = new TermsFilter(new Term("category", unwanted));
f.add(new FilterClause(tf, BooleanClause.MUST_NOT));
}
您可以使用QueryWrapperFilter將任意查詢轉換為過濾器。 您可以使用CachingWrapperFilter來緩存任何過濾器。 所以像這樣:
BooleanQuery bq = new BooleanQuery();
// set up bq
Filter myFilter = new CachingWrapperFilter (
new QueryWrapperFilter (bq)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.