簡體   English   中英

使用facet.field調試Solr查詢顯示的結果比查詢結果多

[英]Debug a Solr query with facet.field shows facet result over more documents than query results

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

由於您在分片環境中運行,因此每個分片必須返回比當前facet.limit更多的項目。 這樣做的原因是,這些方面在其他分片之一中可能得分較高。 它們不是針對不屬於查詢集的文檔計算的(因此它們不會為0)。 構面也會在后台使用索引項的列表,因為構面查詢可用於返回項,即使計數為0也是如此。

即shard 1和2都將foo作為第二大最受歡迎的shard,每個shard命中30次,而shard 1的baz最受歡迎(31個),但沒有帶bar文檔,shard 2的bar最受31的歡迎,但沒有與baz文件。 如果將facet.limit設置為1並且僅返回該數量的facet,則foo將永遠不會返回(因為它是總體上最受歡迎的,但在任何分片中都不如此)。

這還告訴您,為什么每台服務器都包含mincount低於要求的值。 在我們之前的示例中,如果將mincount設置為31,並且該參數傳播到每個分片,則foo將永遠不會從分片返回。 這就是為什么在返回構面的結束列表之后計算mincount的原因。 在您的情況下,這些構面只是按0命中順序排序的構面,但這是一種特殊情況(因為0不會對最終結果有任何貢獻,但是從列表的開頭返回這些構面也不會做任何事情,因為字詞已被檢索並且其分數也已計算出來)。

您可以通過調整facet.overrequest.count (10)和facet.overrequest.ratio (1.5)來控制Solr如何執行構面facet.overrequest.count facet.overrequest.ratio

在這些情況下,默認情況下,每個分片都被要求提供最高的“ facet.overrequest.count +(facet.overrequest.ratio * facet.limit)”約束。

當您使用方面查詢時,這兩項都不需要發生。 每個查詢都在每個服務器上運行,並且這些查詢的計數在返回給用戶之前會被合並。 不用擔心facet.query可能返回在其他節點等上未返回的匹配。在我們的示例中,查詢將返回30 + 30、31 + 0和31 +0。但是,您僅獲得有關您已經知道的術語,而不是可能相關的術語-但您不是要查詢的術語。 就是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM