[英]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.