2015-11-16 18 views
7

個々のトークンではなく、用語全体でバケットを分割するElasticsearch用語集を書くにはどうすればよいですか?例えば、私は州によって集計したいのですが、期待通りにバケツなどの個々のバケットではなく、ニューヨークとニュージャージー州とカリフォルニア州のように、以下の戻り新しい、ニューヨーク、ニュージャージー、カリフォルニア:アレイ内の文字列による弾性検索用語集

curl -XPOST "http://localhost:9200/my_index/_search" -d' 
{ 
    "aggs" : { 
     "states" : { 
      "terms" : { 
       "field" : "states", 
       "size": 10 
      } 
     } 
    } 
}' 

私のユースケースここに記載されているものと同じです https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations-and-analysis.html ただ1つの違いがあります: 私の場合、都市フィールドは配列です。

例オブジェクト:

{ 
    "states": ["New York", "New Jersey", "California"] 
} 

提案された解決策は、(not_analyzedとしてフィールドをマッピング)アレイに動作しないと思われます。

マイマップ:

{ 
    "properties": { 
     "states": { 
      "type":"object", 
      "fields": { 
       "raw": { 
        "type":"object", 
        "index":"not_analyzed" 
       } 
      } 
     } 
    } 
} 

私は「文字列」で「オブジェクト」を置き換えるためにしようとしたが、これはどちらか動作していません。

答えて

4

私はあなたが不足しているすべてはあなたの凝集の"states.raw"(何アナライザが指定されていないため、"states"フィールドはstandard analyzerで分析され、ことに注意してください。サブフィールド"raw""not_analyzed"ある)だと思います。あなたのマッピングも同様に見えるかもしれませんが。私はES 2.0に対するあなたのマッピングを試みたとき、私はいくつかのエラーを得たが、これは働いていた:

PUT /test_index 
{ 
    "mappings": { 
     "doc": { 
     "properties": { 
      "states": { 
       "type": "string", 
       "fields": { 
        "raw": { 
        "type": "string", 
        "index": "not_analyzed" 
        } 
       } 
      } 
     } 
     } 
    } 
} 

それから私は、ドキュメントのカップルを追加しました:

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"states":["New York","New Jersey","California"]} 
{"index":{"_id":2}} 
{"states":["New York","North Carolina","North Dakota"]} 

そして、このクエリは、あなたがやりたいようだ:

POST /test_index/_search 
{ 
    "size": 0, 
    "aggs" : { 
     "states" : { 
      "terms" : { 
       "field" : "states.raw", 
       "size": 10 
      } 
     } 
    } 
} 

返す:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "states": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "New York", 
       "doc_count": 2 
      }, 
      { 
       "key": "California", 
       "doc_count": 1 
      }, 
      { 
       "key": "New Jersey", 
       "doc_count": 1 
      }, 
      { 
       "key": "North Carolina", 
       "doc_count": 1 
      }, 
      { 
       "key": "North Dakota", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
} 

ここで私はそれをテストするために使用されるコードです:

http://sense.qbox.io/gist/31851c3cfee8c1896eb4b53bc1ddd39ae87b173e

+0

は、あなたの答えのためにどうもありがとうございます、あなたは正しいですが、私の質問は、実際に '.raw'が不足しています。それは、私が非常に多くの異なるマッピングと検索の組み合わせを試して、それを投稿したためです。 私の本当の問題は、elasticsearch-transport-couchbaseプラグインを使用して私のドキュメントをElasticsearchにインポートし、プラグインが私のドキュメント構造を変更し、それを '' doc ''属性で囲んでいることです。あなたの答えのおかげで、私は手作業で文書を追加しました。それはうまくいきました。それが、他の文書の周囲の "doc"属性を検出した方法です。 – Marieke