1

私が達成したいのは、一意のペア (都市、州) による集計です。Elasticsearchのドキュメントによると、用語の集約では、同じドキュメント内の複数のフィールドから用語を収集することはサポートされていません。したがって、次のようなネストされた agg を作成しました。

{
  "size": 0,
  "aggs": {
    "cities": {
      "terms": {
        "field": "address.city",
        "size": 12
      },
      "aggs": {
        "states": {
          "terms": {
            "field": "address.stateOrProvince"
          },
          "aggs": {
            "topCity": {
              "top_hits": {
                "size": 1,
                "sort": [
                  {
                    "price.value": {
                      "order": "desc" }}]}}}}}}}}

この集計の結果、次のような応答が得られます。

{
  "aggregations": {
    "cities": {
      "buckets": [
        {
          "key": "las vegas",
          "doc_count": 5927,
          "states": {
            "buckets": [
              { "key": "nv", "doc_count": 5840 },
              { "key": "nm", "doc_count": 85 }
            ]
          }
        },
        {
          "key": "jacksonville",
          "doc_count": 5689,
          "states": {
            "buckets": [
              { "key": "fl", "doc_count": 2986 },
              { "key": "nc", "doc_count": 1962 },
              { "key": "ar", "doc_count": 290 }]}}]}}}

問題は、最も深い doc_count で並べ替えられた結果を取得する方法です。

予想される順序付きリストは次のようになります。

  1. ラスベガス、ネバダ州 (5840)
  2. フロリダ州ジャクソンビル (2986)
  3. ノースカロライナ州ジャクソンビル (1962)
  4. アーカンソー州ジャクソンビル (290)
  5. ラスベガス、nm (85)
4

2 に答える 2

2

複数のバケット間で内側の doc_count を並べ替える方法があるとは思いません。ES 2.0 (まだベータ版) では集計に対してアクションを実行できますが、ES 1.x ではできません。

于 2015-10-02T17:30:23.737 に答える
0

変換を適用することで問題を解決できました

"transform": {
  "script": "ctx._source['address']['cityState'] = ctx._source['address']['city'] + ', ' + ctx._source['address']['state']"
}

次に、新しく追加されたフィールドで集計します。期待どおりに動作します!

于 2015-10-02T18:02:35.807 に答える