Solr:如何提高数字字段上的过滤器查询(针对特定值,而不是范围查询)的性能?

标签 solr lucene

我有一个包含大约 60-1 亿个文档的索引。我们几乎总是在外键 id 上查询这些文档(除了其他过滤器查询和字段查询等),以将查询范围限定到特定的父对象。

因此,例如:/solr/q=*:*&fq=parent_id_s:42

是的,_s 表示当前这是一个 solr.StrField 字段类型。

我的问题是:我应该将其更改为 TrieIntField 吗?这会加快性能吗?如果是这样,理想的 precisionSteppositionIncrementGap 值是多少,因为我知道我将始终查询单个特定值,并且该值的基数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/

相关文章:

ruby-on-rails - 使用 Susnpot Gem 进行 Solr 搜索

elasticsearch - Elasricsearch和Solr数据可视化工具

exception - 如何从Solr删除的索引文件中恢复?

search - 如何缓存搜索结果?

java - lucene中搜索不包含字段的文档

java - Apache solr 如何索引不同的文件

solr 分面搜索 - 如何在 Solr 查询 UI 上指定多个字段?

php - 我的网站在庞大的数据库中搜索数据。我应该使用 Lucene 来搜索还是自己编写算法?

java - Lucene 全文查询拼写检查

indexing - 将值插入Solr bool 字段