使用facet.field调试Solr查询显示的结果比查询结果多

时间:2018-07-09 14:11:14

标签: solr facet

在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?

1 个答案:

答案 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。但是,您仅获得有关您已经知道的术语,而不是可能相关的术语-但您不是要查询的术语。就是这样。

相关问题