我在Solr(版本4.9.1)中使用非常慢的过滤器时遇到问题,有大约50k文档。对于使用特定 category_id 过滤器值的第一个查询,查询需要大约15秒,第二个时间要快得多(需要几毫秒)。但我想总是有快速过滤器:)所以在谷歌搜索后我读到我必须有filterCache和缓存自动装配
Sooo我做过的事情:
filterCache:
<filterCache
class="solr.FastLRUCache"
size="16384"
initialSize="4096"
autowarmCount="4096" />
firstSearcher:
<listener event="firstSearcher" class="solr.QuerySenderListener">
<arr name="queries">
<lst>
<str name="q">*</str>
<str name="fq">category_id:1043</str>
</lst>
</arr>
</listener>
<useColdSearcher>true</useColdSearcher>
<useFilterForSortedQuery>true</useFilterForSortedQuery>
<maxWarmingSearchers>2</maxWarmingSearchers>
它不起作用; /不知道为什么......对于这个类别的第一次进入需要15s,而不是快速。但我总是必须对类别和其他过滤器有快速响应。
我做了一个实验,如果我使用mainquery而不是过滤器,一切都会更好,但过滤器应该和mainquery一样快(我在某处读取它)。
要点:
我想做的事情: 好的,我有~50 000个产品和~1000个类别以及许多其他过滤器(类型,价格等)的商店,我的目录基于SOLR(过滤),现在如果我使用过滤器首次进入类别需要15秒,它每次都必须快......
我的示例查询:
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
<lst name="params">
<str name="debugQuery">true</str>
<str name="website_id:1"/>
<str name="stats.field">PLN_0_price_decimal</str>
<str name="product_status:1"/>
<str name="q">**</str>
<str name="store_id:1"/>
<str name="fq">category_id:10561</str>
</lst>
</lst>
答案 0 :(得分:1)
所以,解决方案很简单,我必须在查询中使用*而不是**。
部分调试部分来自响应*:
<str name="parsedquery">MatchAllDocsQuery(*:*)</str>
<str name="parsedquery_toString">*:*</str>
与**:
的响应相同的调试部分<str name="parsedquery">textSearch:**</str>
<str name="parsedquery_toString">textSearch:**</str>
答案 1 :(得分:0)
第一次使用过滤器时,即使主查询只匹配一对,也需要查看每个文档。您可以禁用此类过滤器的缓存或切换到后置过滤器(通过分配过滤器成本)。更全面的解释是here。