web-dev-qa-db-ja.com

ElasticSearch-一意の値を返す

レコードからすべてのlanguagesの値を取得し、それらを一意にする方法を教えてください。

レコード

PUT items/1
{ "language" : 10 }

PUT items/2
{ "language" : 11 }

PUT items/3
{ "language" : 10 }

クエリ

GET items/_search
{ ... }

# => Expected Response
[10, 11]

どんな助けも素晴らしいでしょう。

99
CharlesJHardy

terms aggregate を使用できます。

{
"size": 0,
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  "size" : 500 }
    }
}}

検索は次のようなものを返します:

{
"took" : 16,
"timed_out" : false,
"_shards" : {
  "total" : 2,
  "successful" : 2,
  "failed" : 0
},
"hits" : {
"total" : 1000000,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
  "langs" : {
    "buckets" : [ {
      "key" : "10",
      "doc_count" : 244812
    }, {
      "key" : "11",
      "doc_count" : 136794

    }, {
      "key" : "12",
      "doc_count" : 32312
       } ]
    }
  }
}

集約内のsizeパラメーターは、集約結果に含める用語の最大数を指定します。すべての結果が必要な場合は、データの一意の用語の数よりも大きい値に設定してください。

135
Anton

Elasticsearch 1.1+には、カーディナリティー集約があり、一意のカウントを提供します

これは実際には近似値であり、高カーディナリティのデータセットでは精度が低下する可能性がありますが、テストでは一般的にかなり正確であることに注意してください。

precision_thresholdパラメーターを使用して精度を調整することもできます。トレードオフ、またはもちろん、メモリ使用量です。

このドキュメントのグラフは、precision_thresholdが高いほど、より正確な結果が得られることを示しています。


Relative error vs threshold

8
bradvido

私も自分のためにこの種の解決策を探しています。 terms aggregate で参照を見つけました。

したがって、次のように適切なソリューションです。

{
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  
                    "size" : 500 }
    }
}}

ただし、次のエラーが発生した場合:

"error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [fastest_method] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
            }
        ]}

その場合、次のようにリクエストに「KEYWORD」を追加する必要があります。

   {
    "aggs" : {
        "langs" : {
            "terms" : { "field" : "language.keyword",  
                        "size" : 500 }
        }
    }}
1
MAULIK MODI