6

分析にElasticSearchを使用しようとしています。具体的には、手巻きのRailsCMSの「トップコンテンツ」を追跡するためです。要件は、コンテンツごとにカウンターを保持するよりもかなり複雑です。基本的なことすらうまくいかないように見えるので、今は問題の深さについては触れません。

私の問題はこれです:私はファセットを使用していますが、カウントは私が期待するものではありません。例えば:

クエリ:

{"facets":{"el_ids":{"terms":{"field":"el_id","size":1,"all_terms":false,"order":"count"}}}}

結果:

{"el_ids":{"_type":"terms","missing":0,"total":16672,"other":16657,"terms":[{"term":"quis","count":15}]}}

わかりました。IDが「quis」のコンテンツは15回ヒットしました。これordercount、であるため、私の一番上のコンテンツになるはずです。次に、上位5つのコンテンツを取得しましょう。

クエリ:

{"facets":{"el_ids":{"terms":{"field":"el_id","size":5,"all_terms":false,"order":"count"}}}}

結果(ファセットのみ):

[
  {"term":"qgz9","count":26},
  {"term":"quis","count":15},
  {"term":"hnqn","count":15},
  {"term":"higp","count":15},
  {"term":"csns","count":15}
]

は?では、IDが「qgz9」のコンテンツのヒット数は26でしたか?最初のクエリで上位の結果にならなかったのはなぜですか?

では、トップ100を取得しましょう。

クエリ:

{"facets":{"el_ids":{"terms":{"field":"el_id","size":100,"all_terms":false,"order":"count"}}}}

結果(ファセットのみ):

[
  {"term":"qgz9","count":43},
  {"term":"difc","count":37},
  {"term":"zryp","count":31},
  {"term":"u65r","count":31},
  {"term":"sxsi","count":31},
  ...
]

では、「qgz9」のヒット数は26ではなく43ですか?どうしてそれができるのでしょうか?インデックスを変更するバックグラウンドでは何も起こらないことを保証できます。これらのクエリを繰り返すと、同じ結果が得られます。

結果サイズを増やすこのプロセスを繰り返すと、カウントは変化し続け、新しいコンテンツIDが一番上に表示されます。誰かが私が間違っていることや、これがどのように機能するかについての私の理解に欠陥があることを私に説明できますか?

4

1 に答える 1

7

これは既知の問題であることが判明しました:

...現在、上位Nファセットが機能する方法は、各シャードから上位Nを取得し、結果をマージすることです。これにより、不正確な結果が生じる可能性があります。

デフォルトでは、私のインデックスは5つのシャードで作成されていました。これを変更して、インデックスにシャードが1つだけになるようにすると、カウントは私の期待に沿って動作します。別の回避策は、常にsize予想されるファセットの数よりも大きい値に設定し、上位N個の結果を剥がすことです。

于 2012-07-07T16:31:07.760 に答える