2014-09-12 81 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是單獨緩存的,因此如果您重新使用過濾器查詢的某些部分您可以獲得更好的緩存性能(而不是將靜態和動態查詢組合在同一個過濾器中,將它們拆分爲一個動態和一個靜態,以便可以更頻繁地重用靜態過濾器)。再一次,性能將取決於。