web-dev-qa-db-ja.com

ElasticSearch-集計クエリで追加のフィールド名を表示する方法

出力バケットに「agency_name」という新しいキーを追加するにはどうすればよいですか。

以下に示すように集約コードを実行しています

{
  "aggs": {
    "name": {
      "terms": {
        "field": "agency_code"
      }
    }
  }
}

私は次のようにアウトを取得します

"aggregations": {
    "name": {
        "doc_count_error_upper_bound": 130,
        "sum_other_doc_count": 39921,
        "buckets": [
            {
                "key": "1000",
                "doc_count": 105163
            },
            {
                "key": "2100",
                "doc_count": 43006
            }
        ]
    }
}

表示中に、代理店名、コード、doc_countを表示する必要があります

以下のフォーマットを取得できるように、集計クエリを変更するにはどうすればよいですか。 ElasticSearchは初めてですが、これを修正する方法がわかりません

"aggregations": {
    "name": {
        "doc_count_error_upper_bound": 130,
        "sum_other_doc_count": 39921,
        "buckets": [
            {
                "key": "1000",
                "doc_count": 105163,
                "agency_name": 'Agent 1'
            },
            {
                "key": "2100",
                "doc_count": 43006,
                "agency_name": 'Agent 2'
            }
        ]
    }
}

ElasticSearchのサンプルデータ(フィールドが分​​析されます)

{

    "_index": "feeds",
    "_type": "news",
    "_id": "22005",
    "_version": 1,
    "_score": 1,
    "_source": {
        "id": 22005,
        "name": "Test News",
        "agency_name": "Agent 1",
        "agency_code": "1000",
    }

}
22
Amal Kumar S

以下のリンクのように、上位ヒットの集計を使用できます。追加の集計を作成すると、代理店名が別の「ヒット」キーの下に埋め込まれるため、形式は少し異なります。

ElasticSearch用語の集計にフィールドを追加

{
  "aggs": {
    "name": {
      "terms": {
        "field": "agency_code"
      },
      "aggs": {
        "agency_names" : {
           "top_hits": {
                size: 1, 
                _source: {
                    include: ['agency_name']
                }
            }
         } 
       }
    }
  }
}
10
Rajas Agashe

それに別の「aggs」を追加する必要があると思います。しかし、それは希望する形式ではなく、出力の別のフィールドとして表示されます。理由は、現在「agency_code」に基づいて集計しているためで、doc_countは特定の代理店コードの発生回数を示しています。ここで、「agency_name」に基づいて集計する場合、フィールドが「agency_code」とは異なるドキュメントにあり、番号も異なる場合があります。これらのペアが常にペアで存在する場合、この親子のインデックス付けが役立つ場合があります。

https://www.elastic.co/guide/en/elasticsearch/guide/current/indexing-parent-child.html

2
Aditya Patel

これは古い投稿ですが、同じ問題に遭遇しました https://www.elastic.co/guide/en/elasticsearch/reference/current/agg-metadata.html =。メタデータの詳細を追加すると、上記のバケットの結果の一部として返されます。それが将来誰かを助けることを願っています。

1
Vishwa

ESには、agency_nameagency_codeが1対1で対応していることがわかりません。したがって、私はいくつかの可能な戦略をお勧めします。

  • agency_nameを分析せず、そのフィールドでaggという用語を使用しないでください。実際にagency_nameのトークン化を行う必要があるとしたら、私は驚きます。
  • IDから名前へのマッピングをリレーショナルデータベースまたはフラットファイルキャッシュに保存し、クライアント側で結合を行う
  • 代理店ドキュメントを別のタイプとして保存し、2つの呼び出しを行います。最初にIDを取得し、次に2番目にIDで代理店を検索します

Aditya Patelが前述したように、親子関係も役立つ場合がありますが、id-> nameマッピングを解決するには、上記の戦略のいずれかを使用する必要があると思います。

1
Andrew White