所以有一个SOLR查询,其中一个fq是一个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))
语句,我只是执行solr query OR (nba:number1 OR nba:number2 OR nba:number3 ...etc)
?< / p>
有没有办法进一步优化FunctionQuery,使其变得更快?
答案 0 :(得分:2)
通常,您必须调用的函数查询越少越好。也就是说,它可能不是您的特定用例的性能问题,具体取决于索引中的文档数量,查询负载和配置文件以及缓存的用法和大小。
由于Solr有许多可用的缓存(Lucene有Field Cache that caches Function Queries),实际的性能影响会因外部因素而异。
您必须进行一些分析运行或实时负载测试,以确定在这种情况下是否值得优化,但请记住fq = -terms是单独缓存的,因此如果您重复使用过滤查询的一部分,您可以获得更好的缓存性能(而不是在同一个过滤器中组合静态和动态查询,将它们分成一个动态和一个静态,以便可以更频繁地重用静态过滤器)。再次,性能将取决于。