2014-09-12 50 views
0

所以有SOLR查询,其中FQ的之一是FunctionQuerySOLR FunctionQuery性能

http://wiki.apache.org/solr/FunctionQuery

这是我的FQ的

{!frange l=1}or(and(exists(not(query({!v='type:scu'}))), or(or(termfreq(nba,184887),termfreq(nba,15817823),termfreq(nba,15819703),termfreq(nba,15821195),termfreq(nba,15859845),termfreq(nba,15860041), ...and 2000 other termfreq() calls))),exists(query({!v='isn_field:400112'})),exists(query({!v='(type:scu AND (is_svad:(20332 OR 21017 OR 200662 OR 23 OR 2685 OR 653 OR 266035 OR 267 OR 26612 OR 566127 OR 264129 OR 266133)))'}))) 

我的问题之一是,如何做的这个FunctionQuery的性能比较,如果我不使用FunctionQuery,例如,而不是有功能or(termfreq(nba, number), termfreq(nba, number))我只是做索尔查询OR (nba:number1 OR nba:number2 OR nba:number3 ...etc)

有没有办法进一步优化FunctionQuery,使其变得更快?

+0

看看新的Solr 4.10 [术语过滤器](http://heliosearch.org/solr-terms-query/),它可以更有效地匹配单个字段中的许多术语。 – rchukh 2014-09-13 13:03:04

回答

1

一般来说,你必须调用的Function Queries越少越好。也就是说,根据索引中文档的数量,查询负载和配置文件以及缓存的使用情况和大小,它可能不是您特定用例的性能问题。

由于Solr有许多可用的缓存(并且Lucene有Field Cache that caches Function Queries),实际的性能命中会因外部因素而异。

在这种情况下,您必须执行一些性能分析运行或活动负载测试以确定是否值得优化,但请记住fq = -terms是单独缓存的,因此如果您重新使用过滤器查询的某些部分您可以获得更好的缓存性能(而不是将静态和动态查询组合在同一个过滤器中,将它们拆分为一个动态和一个静态,以便可以更频繁地重用静态过滤器)。再一次,性能将取决于。