2017-10-10 12 views
0

こんにちは私のウェブサイトで検索バーを作ろうとしています。私には何千もの会社の記事があります。私はこのコードを実行すると:弾性検索凝集とフィルター

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であり、文書の配布は、このようなものだった場合:

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

 
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項はにマージされています

そこから上位3つの結果だけが返されます。ほとんどの場合、これらのキーの数が少なすぎます。

シャード1のUMiamiドキュメントは、深度3を超えているため考慮しません。しかし、UMiamiのみを見るようにフィルタすると、必然的に関連するドキュメントがすべて取り戻されます正確なカウントで終わります。

shard_sizeパラメータで再生することができます。これにより、Elasticsearchが各シャードに少し近づくように見えるようになります。しかし、このファセットには合計7つのドキュメントがあるので、あなたのシャードの1つに1つしか存在しない可能性が高いので、そのシャードのすべてのドキュメントを取得することなく、上位の集計にそのドキュメントを表示することは困難です。

カウント近似とエラー導出の詳細については、here-tldrを参照してください。Elasticsearchは、個々のシャードの最上位の集計に基づいて、そのファセットのドキュメントの合計数を推測しています。

+0

ありがとうございます。 Uは今日を救った:) –