Lucene:完全禁用加权,评分,排名,

qqi*_*ihq 3 lucene

我使用Lucene来建立令牌共同出现次数的一大指标(例如[elephant,animal][melon,fruit][bmw,car],...)。我使用a查询索引以获取这些共现,BooleanQuery以获取绝对计数,这两个标记在索引中共现的频率如下:

// search for documents which contain word+category
BooleanQuery query = new BooleanQuery();
query.add(new TermQuery(new Term("word", word)), Occur.MUST);
query.add(new TermQuery(new Term("category", category)), Occur.MUST);
// only care about the total number of hits
TotalHitCountCollector collector = new TotalHitCountCollector();
searcher.search(query, collector);
int count = collector.getTotalHits();
Run Code Online (Sandbox Code Playgroud)

这些查询非常频繁地运行,我目前对性能不满意。我发现,该方法BooleanQuery#createWeight需要很多时间。现在,我不需要对结果进行任何评分或排名,因为我只对绝对文件计数感兴趣。

是否有一种方便的方法(例如,预先存在的类)完全禁用计分和加权?如果没有,是否有任何提示需要针对用例扩展哪些类?

fem*_*gon 5

我不太确定它是否会绕过得分,以提高您想要的性能,但是应用恒定得分的一种简单方法是将查询包装在内ConstantScoreQuery,例如:

BooleanQuery bq = new BooleanQuery();
//etc.
ConstantScoreQuery query = new ConstantScoreQuery(bq);
searcher.search(query, collector);
Run Code Online (Sandbox Code Playgroud)

但是,我强烈建议您使用Filters。过滤器不仅会绕过分数,还会缓存结果,因此,尤其是您的“类别”字段似乎将是一个很好的选择。首次使用过滤器查询类别时,将需要更长的时间,因为它需要为该过滤器建立缓存,但是此后,您应该会看到速度有了很大的提高。看一下FieldCacheTermsFilter

喜欢:

Query query = new TermQuery(new Term("word", word));
Filter filter = new FieldCacheTermsFilter("category", category);
TotalHitCountCollector collector = new TotalHitCountCollector();
searcher.search(query, filter, collector);
int count = collector.getTotalHits();
Run Code Online (Sandbox Code Playgroud)

  • 感人的; 使用了`FieldCacheTermsFilter`,现在感觉速度提高了 100 倍。谢谢! (2认同)