問題タブ [elasticsearch-aggregation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
elasticsearch - ドキュメントの総数に基づいて top_hits サブ集計を除外する
Elasticsearch GeoHash グリッド集約を使用してマップ クラスタリングを行っています。クエリは、平均 100 ~ 200 個のバケットを返します。各バケットは、集約されたクラスターごとに 3 つのドキュメントを返すために使用する top_hits 集約を使用します。
問題は、親の集計 (GeoHash) が 3 つ以下のドキュメントを集計する場合にのみ、 top_hits を返したいことです。
クラスターが 3 つ以上のドキュメントを集約する場合、ES がこのクラスターのドキュメントを返さないようにします (それらを使用しないため)。
Bucket Selector Aggregationを使用しようとしましたが、正しいbucket_pathを作成できませんでした。top_hits アグリゲーションと同じレベルでバケット セレクタ アグリゲーションを使用します。バケットの合計ドキュメント数は で入手できますtop_hits.hits.total
が、得られるのはreason=path not supported for [top_hits]: [hits.total]
です。
これはelasticsearchで可能ですか? これは私にとって重要です。ほとんどのクエリでは、ドキュメントが 3 つ未満のバケットはごく一部しかないためです。ただし、トップ ヒット サブアグリゲーションは、1000 ドキュメントのクラスターであっても、常に上位 3 つのドキュメントを返します。クエリの結果が 200 個のバケットを返し、そのうちの 5 個のみが <= 3 ドキュメントを集約している場合、200*3 ではなく 5*3 ドキュメントのみを返す必要があります (この場合、応答は 10MB です)。
ここに私のクエリの aggs 部分があります:
elasticsearch - 可視バケット データを合計する代わりに、元の elasticsearch sum_bucket を取得します
すべてのバケット結果を表示せずに、elasticsearch 集計から元のバケット (すべての集計結果) データの合計を取得できますか? 私はelasticsearch 2.2を使用しています。
例: これは元のクエリの元の結果です (簡単にするため)
そして、これは私が欲しいものです
バケットがすべての結果バケットを表示していないことを考えると、結果バケットsum_bucket
の実際の合計が表示されます。
すべての集計の合計を取得できますが、すべてのバケットを含める必要があります。結果が大きすぎるため、結果の転送に時間がかかります。下手な英語でごめんなさい。
elasticsearch - Elastic Search 条件に応じてバケットに集約
私は Elastic Search を使い始めており、いくつかの集計をしようとして行き詰っています。基本的に、次の形式のデータで構成されるデータセットがあります。
ここで、いくつかの集計を行い、ニューヨークのすべてのコンチネンタル レストラン、グッド レストラン、レストランを 1 つのクエリで取得したいと考えています。
すべての種類のレストランの数が必要なわけではなく、特定の種類の数だけが必要であることに注意してください。また、これらの集計は相互に独立しています。つまり、私がGOODと言うとき、必ずしもそれがコンチネンタルであることを望んでいるわけではなく、イタリア語でも何でも構いません.
これは私が試したことです:
エラーが表示されます:
これは簡単な質問のように思えますが、私は長い間その問題に悩まされてきました。どんな助けでも大歓迎です。
elasticsearch - 別のフィールドの top_hits に対する Elasticsearch 集計
フィルター処理された一連のドキュメントに対して集計を実行しようとしています。ただし、フィルターの仕様では、集計を使用する必要があります (各「申請者」の最新の「テスト」)。最上位の集計はドキュメントのフィールドで実行されますが、フィルター集計が実行されたフィールドとは異なるフィールドで実行されます。
たとえば(そして、私はここで別のユーザーの質問に基づいて構築しています:最小フィールド値のクエリまたはフィルター?)。
次の一連のドキュメントがあるとします。
各カテゴリで最高のスコアを獲得したユーザーの数を調べることに関心があります。
つまり、次のことを行います。
- 各ユーザーの最高得点のテストのみをフィルタリングします
- トピックに基づいて結果をグループ化 (およびカウント) します。
したがって、ステップ 1 では、次のものだけを使用する必要があります。
ステップ 2 では、トピックごとにグループ カウントします。
問題は、フィルタリングにaggregation/top_hitsを使用する場合です:
最初のステップ (top_hits) は正しくできましたが、「親」集計を「トピック」で追加すると、「申請者」が異なる「トピック」バケット間で混合されるため、top_hits 集計が適切に機能しなくなります。最大スコアは不正確になります。
「トピック」集計の前にクエリ フィルターを使用するのが最善の方法のようですが、各応募者の最高得点テストのみを保持するようにそのようなフィルターを作成することはできませんでした。
何か案は?
java - Unix タイムスタンプの Java 範囲集計
Elasticsearch (バージョン 2.3.1) インデックスには、showDate
すべてのドキュメントのフィールドがあります。showDate
このフィールドには UNIX タイムスタンプが含まれており、過去 24 時間に が含まれているドキュメントの数とshowDate
、過去 7 日間にが含まれているドキュメントの数を調べたいと考えています。
私のJavaコードでは、これは私がこれを達成しようとした方法です:
この検索リクエストを実行して生成されたクエリを見ると、次のような結果が得られます
KopfやHeadなどのプラグインでクエリを実行すると、期待どおりの結果が得られます。Java サービスで実行すると、docCount は常に 0 になります。
私が気づいた唯一の違いは、プラグインが double 値を long 値に変換することです。したがって、クエリを送信した後、1.465455690E9
数値は に変換され1465455690
ます。プラグインから得られるのと同じ結果を Java サービスで得る方法を知っている人はいますか?
更新 1 Dimitris の回答のおかげで、私のコードは次のようになります。しかし、それでも期待される結果は得られません。Head と Kopf が結果があることを通知しても、DocCount は常に 0 のままです。
更新 2: 私の最終的な解決策は次のようになります。
また、日付型になるようにインデックスを変更する必要showDate
がありました (形式はまだ epoch_second です)。
elasticsearch - Elasticsearch SQL のようなサブクエリ集計
私は ES をいじって、私のシナリオのほとんどをカバーできるかどうかを理解しています。私は、SQL で非常に単純な特定の結果に到達する方法を考えているところに行き詰まっています。
これがその例です
エラスティックには、このドキュメントのインデックスがあります
SQL の特定の日付範囲で人々がさまざまな店で購入した果物の数を知りたい場合は、次のように記述します
結果はこのようなものです
集計を使用してエラスティックで同じ結果を得る方法を知っていますか?
一言で言えば、私がエラスティックで直面している問題は次のとおりです。
- 集計前にサブデータを準備する方法 (この例では、各フルーツの範囲内の最新の行のように)
- 複数のフィールドで結果をグループ化する方法
ありがとうございました