我有一个包含大约 60-1 亿个文档的索引。我们几乎总是在外键 id 上查询这些文档(除了其他过滤器查询和字段查询等),以将查询范围限定到特定的父对象。
因此,例如:/solr/q=*:*&fq=parent_id_s:42
是的,_s
表示当前这是一个 solr.StrField
字段类型。
我的问题是:我应该将其更改为 TrieIntField
吗?这会加快性能吗?如果是这样,理想的 precisionStep
和 positionIncrementGap
值是多少,因为我知道我将始终查询单个特定值,并且该值的基数parent_id
在 10,000-100,000(最大)数量级?
编辑其他细节(来自对以下答案的评论): 我们系统的使用方式,事实证明我们最终对连续的许多查询使用相同的 fq。当缓存被填充时,系统运行速度极快。当缓存因提交而被转储时,此查询(即使是仅包含此 fq 的测试用例)最多可能需要 20 秒。所以我想弄清楚如何加快填充缓存的初始查询。
第二次编辑:
我很抱歉,经过进一步测试后发现,上述糟糕的性能只会在还返回 facet 字段时发生(例如 &facet=true&facet.field=resolved_facet_facet
之类的东西)。对于这些字段中的十几个,有时查询需要花费 20-30 秒,但仅限于新搜索者。填充缓存时是即时的。所以也许我的问题是 facet 字段,而不是 parent_id 字段。
最佳答案
具有 precisionStep 的
TrieIntField
针对范围查询进行了优化。由于您只搜索特定值,因此您的字段类型是最佳的。
你看过自动热查询吗?每当创建新的 IndexSearcher 时(例如在启动时,在索引提交时),它们就会运行,以便它可以在已经存在的一些缓存中使用。根据您的要求,您还可以将 useColdSearcher
标志设置为 true,这样新的 Searcher 仅在缓存预热后可用。有关详细信息,请查看此处:https://cwiki.apache.org/confluence/display/solr/Query+Settings+in+SolrConfig#QuerySettingsinSolrConfig-Query-RelatedListeners
关于Solr:如何提高数字字段上的过滤器查询(针对特定值,而不是范围查询)的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24834277/