2017-10-10 230 views
0

嗨,朋友我想在我的網站做一個搜索欄。我有數以千計的公司文章。當我運行這段代碼:Elasticsearch聚合和過濾器

GET articles/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "multi_match": { 
      "query": "assistant", 
      "fields": ["title"] 
      } 
     } 
     ] 
    } 
    }, 
    "size": 0, 
    "aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company.keyword", 
     "size": 10 
     } 
    } 
    } 
} 

結果是:所以現在

"aggregations": { 
"by_company": { 
    "doc_count_error_upper_bound": 5, 
    "sum_other_doc_count": 409, 
    "buckets": [ 
    { 
     "key": "University of Miami", 
     "doc_count": 6 
    }, 
    { 
     "key": "Brigham & Women's Hospital(BWH)", 
     "doc_count": 4 
    }, 

我想邁阿密大學的過濾器的文章使我運行下面的查詢:

GET indeed_psql/job/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "multi_match": { 
      "query": "assistant", 
      "fields": ["title"] 
      } 
     } 
     ], 
     "filter": { 
     "term": { 
      "company.keyword": "University of Miami" 
     } 
     } 
    } 
    }, 
    "size": 0, 
    "aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company.keyword", 
     "size": 10 
     } 
    } 
    } 
} 

但現在結果是:

"aggregations": { 
    "by_company": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "University of Miami", 
      "doc_count": 7 
     } 
     ] 
    } 

爲什麼在以前的聚合中突然有7個是6?其他大學過濾器也會發生這種情況。我究竟做錯了什麼 ?我沒有使用標準的標記語言,並使用english_stemmer,english_stopwords,english_keywords。謝謝你的幫助。

回答

1

您的第一個查詢文檔很可能是錯誤的。在第一個響應中,「doc_count_error_upper_bound」爲5,這意味着返回聚合中的某些術語不會作爲每個底層查詢分片中的最佳結果。文件計數總是太低而不是太高,因爲在查詢前N個鍵的分片的過程中,它可能已被「錯過」。

你有多少片碎片?例如,如果有3個碎片,和你的聚合大小爲3,你的分發文件是這樣的:

 
Shard 1  Shard 2  Shard 3 
3 BYU  3 UMiami 3 UMiami 
2 UMich  2 BWH  2 UMich 
2 MGH  2 UMich  1 BWH 
1 UMiami  1 MGH  1 BYU 

,您的最終從每個碎片前3項合併爲:

 
6 UMiami // returned 
6 UMich // returned 
3 BWH // returned 
3 BYU 
2 MGH 

從中,只返回前三個結果。幾乎所有這些鍵都被低估了。

你可以看到在這種情況下,Shard 1中的UMiami文檔不會考慮它,因爲它超出了3的深度。但是如果你過濾只看UMiami,你必然會退回任何關聯的文檔在每個分片中,並以精確的計數結束。

你可以玩shard_size參數,這樣Elasticsearch看起來更深入每個分片也得到更近似的計數。但鑑於此方面共有7個文檔,可能在您的一個分片中只有一個文檔發生,因此如果沒有獲取該分片的所有文檔,將很難將其顯示在頂部聚合中。

您可以閱讀更多關於計數近似值和誤差推導的信息here - tldr,Elasticsearch根據每個單獨分片中的最高聚合情況猜測該分面的文檔總數。

+0

謝謝你。你保存了一天:) –