在Solr 4.10中,我有11个分片核心中的170.000.000个文档。自2008年以来,每个文档都代表我网站上的访问,而11个核心中的每一个都代表一年。
我需要找到项目列表的访问权限,因此进行如下查询:
using facet.field, "QTime": 10557
(在清除内核重新加载的缓存后)
q=(owningItem:178350+OR+owningItem:51760+OR+owningItem:71585)+AND+statistics_type:view&shards=localhost:8080/solr//statistics-2014,localhost:8080/solr//statistics-2017,localhost:8080/solr//statistics-2016,localhost:8080/solr//statistics-2008,localhost:8080/solr//statistics-2011,localhost:8080/solr//statistics-2012,localhost:8080/solr//statistics-2010,localhost:8080/solr//statistics-2013,localhost:8080/solr//statistics-2009,localhost:8080/solr//statistics-2015,localhost:8080/solr//statistics&facet.limit=4&facet.field=owningItem&facet.mincount=1
结果:
"facet_counts": {
"facet_queries": {},
"facet_fields": {
"owningItem": [
"51760",
3502,
"71585",
1860
]
},
"facet_dates": {},
"facet_ranges": {},
"facet_intervals": {}
},
调试该查询时,对于每个核心,我可以看到返回的facet.field值不属于查询结果:
response={numFound=953,start=0,maxScore=1.9732983,docs=[]},sort_values={},facet_counts={facet_queries={},facet_fields={owningItem={51760=556,71585=397,**1=0,10=0,100=0,1000=0,10000=0,100000=0,100001=0,100002=0,100003=0,100004=0,100005=0,100007=0,100008=0,10001=0**}},facet_dates={},facet_ranges={},facet_intervals={}}
因此,我尝试使用facet.query代替facet.field
using facet.query, "QTime": 1346
q=(owningItem:178350+OR+owningItem:51760+OR+owningItem:71585)+AND+statistics_type:view&shards=localhost:8080/solr//statistics-2014,localhost:8080/solr//statistics-2017,localhost:8080/solr//statistics-2016,localhost:8080/solr//statistics-2008,localhost:8080/solr//statistics-2011,localhost:8080/solr//statistics-2012,localhost:8080/solr//statistics-2010,localhost:8080/solr//statistics-2013,localhost:8080/solr//statistics-2009,localhost:8080/solr//statistics-2015,localhost:8080/solr//statistics&facet.limit=4&facet.query=owningItem:178350&facet.query=owningItem:51760&facet.query=owningItem:71585&facet.mincount=1
"facet_counts": {
"facet_queries": {
"owningItem:178350": 0,
"owningItem:51760": 3502,
"owningItem:71585": 1860
},
"facet_fields": {},
"facet_dates": {},
"facet_ranges": {},
"facet_intervals": {}
},
然后调试,只包含属于结果的项目:
response={numFound=953,start=0,maxScore=1.9732983,docs=[]},sort_values={},facet_counts={facet_queries={owningItem:178350=0,owningItem:51760=556,owningItem:71585=397},facet_fields={},facet_dates={},facet_ranges={},facet_intervals={}}
我得出的结论是,facet.field的计算结果超出了Solr查询的结果。但是,我认为这个结论不是正确的。
我的问题:
为什么facet.query比facet.field快?
Solr是否真的对不属于查询结果的文档计算facet.field?
答案 0 :(得分:0)
由于您在分片环境中运行,因此每个分片必须返回比当前facet.limit
所指示的更多的项目。原因是这些方面可能在其他分片之一中得分较高。它们不是针对不属于查询集的文档计算的(因此它们不会为0)。构面也会在后台使用索引词的列表,因为构面查询可以用于返回条件,即使计数为0。
即分片1和2均以foo
为第二受欢迎的分片,每个分片命中30次;而分片1的baz
最受欢迎,分片为31,但没有文档带有bar
的分片2个拥有bar
的网站在31个中最受欢迎,但没有baz
的文档。如果将facet.limit
设置为1,并且仅返回了该数量的构面,则foo
将永远不会返回(因为它是最受欢迎的整体,但不在任何分片中)。
这还告诉您,为什么mincount
低于请求的服务器时,每个服务器都包含这些值。在我们之前的示例中,如果mincount
设置为31,并且该参数传播到每个分片,则foo
将永远不会从分片返回。这就是为什么在 之后返回了方面的最终列表之后计算了最小计数的原因。在您的情况下,这些构面只是按0命中顺序排序的构面,但这是一种特殊情况(因为0不会对最终结果有任何贡献,但是从列表的开头返回这些构面也不会做任何事情,因为检索出这些术语,并计算出它们的分数。)
您可以通过调整facet.overrequest.count
(10)和facet.overrequest.ratio
(1.5)来控制how Solr performs overrequesting for facets。
在这种情况下,默认情况下,每个分片都被要求提供最高的“ facet.overrequest.count +(facet.overrequest.ratio * facet.limit)”约束。
在使用构面查询时,这两个都不需要进行。每个查询都在每个服务器上运行,并且这些查询的计数在返回给用户之前会被合并。不用担心facet.query可能返回在其他节点等上未返回的匹配。在我们的示例中,查询将返回30 + 30、31 + 0和31 +0。但是,您仅获得有关您已经知道的术语,而不是可能相关的术语-但您不是要查询的术语。就是这样。