我们运行的是Solr 3.4,索引相对较小,约为90000个文档。这些文档被拆分为多个逻辑源,因此每次搜索都会对特定源应用一个过滤查询,例如:
?q=<query>&fq=source:<source>
其中CCD_ 1是经典字符串字段。我们使用edismax,并有一个默认的搜索字段text。
我们目前看到q=*
的平均运行时间是q=*:*
的20倍。差异非常明显,*:*
耗时100ms,*
耗时3500ms。在文档集中搜索一个常用词(匹配所有文档的近50%)将在不到200ms的时间内返回结果。
查看debugQuery打开的查询,我们可以看到*
被解析为DisjunctionMaxQuery((text:*))
,而*:*
被解析为MatchAllDocsQuery(*:*)
。这是有道理的,但我仍然觉得这并不能解释如此严重的放缓(与50%的文档相比,放缓了2000%)。
是什么原因造成的?有什么我们可以调整的吗?
当您只传递source
0时,您需要检查字段中的每个值,并将其与*
进行匹配,这是一项艰巨的任务。然而,当您使用* : *
时,您要求Solr提供所有信息,并跳过任何匹配。
Solr/Lucene经过优化,可以快速高效地执行* : *
!