web-dev-qa-db-ja.com

elasticsearchで個別のカウントではなく、個別の値を検索します

Elasticsearchドキュメント 提案する*そのコードの一部

*ドキュメントの修正

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "cardinality": {
        "field": "color"
      }
    }
  }
}

sQLクエリに対応

SELECT DISTINCT(color) FROM cars

しかし、実際には

SELECT COUNT(DISTINCT(color)) FROM cars

私が持っている個別の値の数は知りたくありませんが、個別の値は何ですか。誰もそれを達成する方法を知っていますか?

32
jasiustasiu

colorフィールドで terms aggregate を使用します。そして、個別の値を取得したいフィールドの分析方法に注意を払う必要があります。つまり、インデックス作成中にトークン化しないことを確認する必要があります。フィールドの内容。

それでもトークン化が必要で、terms集計を使用する場合は、not_analyzedそのフィールドのインデックスの種類。おそらく multi fields を使用します。

車の用語集約:

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}
32
Andrei Stefan

Andrei Stefanからの優れた回答を更新するには、クエリパラメータsearch_type=countはElasticsearch 5ではサポートされなくなりました。これを行う新しい方法は、"size" : 0などの本文:

GET /cars/transactions/_search
{
  "size": 0,
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}
24
Ortomala Lokni

個人的には、両方の答えは私にとって不可解であり、複数のフィルターを追加したいときは絶望的に複雑でした。

私にとって理にかなったことは、[検出]タブに移動して、必要なフィルターを適用することでした。その後、検索を保存しました。

次に、保存した検索を使用して新しい棒グラフの視覚化を作成しました。次に、関心のあるフィールド(この場合はユーザー名)に基づいて用語の集計を使用するようにX軸を変更し、カウントで並べ替えます。サイズが500などの大きなものであることを確認します。

チャートの下に表形式で結果を取得できるはずです。シンプルで複雑なJSONプログラミングはありません。数回クリックするだけです。視覚化を保存して後で使用することもできます。

2
Phlucious