2017-09-10 12 views
1

私はElasticsearchを使用してクリックトラフィックを保存しており、各行にはアクセスしたページのトピックが含まれています。Elasticsearch:配列内の異なる値を集計します

{ 
    "date": "2017-09-10T12:26:53.998Z", 
    "pageid": "10263779", 
    "loc_ll": [ 
    -73.6487, 
    45.4671 
    ], 
    "ua_type": "Computer", 
    "topics": [ 
    "Trains", 
    "Planes", 
    "Electric Cars" 
    ] 
} 

私が返されますcars何のために検索するので、もし各topicsがキーワードになりたい:典型的な行は次のようになります。 Electric Carsのみが結果を返します。

また、すべての行のすべてのトピックについて個別のクエリを実行して、使用するすべてのトピックのリストを取得したいとします。

pageidでこれを行うと、次のようになりますが、topicsアレイでこれにアプローチする方法がわかりません。

{ 
    "aggs": { 
    "ids": { 
     "terms": { 
     "field": pageid, 
     "size": 10 
     } 
    } 
    } 
} 

答えて

1

利用可能な用語をクエリして取得する方法は問題ありません。おそらくマッピングを確認する必要があります。 carsの結果が得られた場合、topicsのマッピングが解析された文字列(例:keywordではなくtext)であるように見えます。したがって、このフィールドのマッピングを確認してください。

GET keywordarray/item/_search 
{ 
    "size": 0, 
    "aggs": { 
    "topics": { 
     "terms": { 
     "field": "topics" 
     } 
    } 
    } 
} 

は、このになります:

"aggregations": { 
    "topics": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
     "key": "another", 
     "doc_count": 1 
     }, 
     { 
     "key": "first topic", 
     "doc_count": 1 
     }, 
     { 
     "key": "second topic", 
     "doc_count": 1 
     } 
    ] 
    } 
} 
+0

'keyword'が、それは、私はそれをマッピングした。このサンプルデータ

POST keywordarray/item { "id": 123, "topics": [ "first topic", "second topic", "another" ] } 

と、この凝集に

PUT keywordarray { "mappings": { "item": { "properties": { "id": { "type": "integer" }, "topics": { "type": "keyword" } } } } } 

文字列として配列を連結するための 'keyword'と考えます。 – dmo

0

これは非常に治療的です。マッピングタイプをkeywordに変更するだけで、私が必要なものを達成することができました。

私の一部は、配列を文字列に連結すると考えました。しかし、それは

{ 
    "mappings": { 
    "view": { 
     "properties": { 
     "topics": { 
      "type": "keyword" 
     },... 
     } 
    } 
    } 
} 

をせず、

{ 
    "aggs": { 
    "ids": { 
     "terms": { 
     "field": pageid, 
     "size": 10 
     } 
    } 
    } 
} 

のような検索クエリがフィールドの配列のすべての要素の明確なリストを返します。

関連する問題