1

私はESに少し慣れていないので、次のことを行う方法がわかりません:

いくつかの「すべき」パラメーターのみを含むクエリで検索を実行します。

次に、パーセンタイル、ターム バケットなどのいくつかの集計も行います。

しかし、集計については、たとえば、最初の 1000 個のドキュメントを集計したいだけです (スコアが付けられ、スコアによって順序付けられることを願っています)。

アイデアは、特定の用語の集計が必要ですが、十分な数が見つからない場合はそれを埋めますが、集計する特定の最大数に制限されています。ドキュメントからsizeは、返されるドキュメントの数であり、agg に使用されるサイズではないようです (ヒットは必要ありません。返される agg のみです)。

では、これについてどうすればよいでしょうか。ネストされた/後続のクエリはありますか? pipelineたとえば、1,000 個のドキュメントを検索して、それを集計する必要がありますか?

ドキュメントがインデックス付けされたタイムスタンプで最初にソートできれば理想的です-「いっぱいになる」ために使用されるドキュメントが最新になるように-しかし、AFAIKは不可能ですか?

埋めますか?

「埋める」とは、指定された 1 つの「すべき」フィールドに対して 100 個のドキュメントがあることを意味します。次に、必要な1kの結果サイズを集計するために、他の900個のドキュメントが必要です(必要な数まで埋めるため)。したがって、フィルターを使用する代わりに、ドキュメントで「結合されたクエリ」を見たので、「すべき」パラメーターを使用するだけで十分だと思います。

4

1 に答える 1

0

解決:

        sample = A('sampler', shard_size=docs_per_shard)

ドキュメントのサブセットを集計するには、Sampler アグリゲーターを使用します。これにより、ドキュメントのサブセットが返されます。shard_size パラメーターが必要です。これは、シャードごとに返さなければならないドキュメントの数です。指定された値は、必要なドキュメント サイズ (100) をアクティブなシャード (5) で割ったものです。

        terms = A('terms', field='action')
        sea = GameAction.search()
        sea.aggs.bucket('mesam', sample).bucket('aksies', terms)

サブサンプルがあれば、それをパイプすることで集計できるようになりました。これで解決策が得られますが、さらに改善します。

        sea = sea.sort('_score', {'created_at': 'desc'})

これにより、ドキュメントがスコアで並べ替えられ、次に作成日で並べ替えられます。つまり、最も関連性の高いドキュメントが返され、最新のものから順番に並べられます。

さらに:

        sea = sea.query('bool', boost=10, should=[Q('match', player=p['name'])])
        sea = sea.query('bool', boost=5, should=[Q('match', vs=vs)])
        sea = sea.query('bool', boost=2, should=[Q('match', phase=phase)])
        sea = sea.query('bool', boost=1, should=[Q('match', site='handhq')])
        sea = sea.query('bool', must=[
            ~Q('match', action='gg') &
            ~Q('match', action='sb') &
            ~Q('match', action='bb')])

ここで関連するのはshould. これにより、一致またはほぼ一致する最も関連性の高いドキュメントでドキュメントを「埋める」ことができます(同じ場合は最新のものでソートされます)。これらのフィールドは主にnot_analyzed. また、問題に対する非常に優れた解決策を提供するためにブーストすることもできます。

于 2016-10-26T05:48:12.843 に答える