Elasticsearchで特定のフィールドのすべての一意の値を検索するにはどうすればよいですか?
私はのような種類のクエリを持っているselect full_name from authors
ので、フォームでユーザーにリストを表示できます。
Elasticsearchで特定のフィールドのすべての一意の値を検索するにはどうすればよいですか?
私はのような種類のクエリを持っているselect full_name from authors
ので、フォームでユーザーにリストを表示できます。
「full_name」フィールドに用語ファセットを作成できます。ただし、これを適切に行うには、インデックス作成中にトークン化していないことを確認する必要があります。そうしないと、ファセット内のすべてのエントリが、フィールド コンテンツの一部である別の用語になります。ほとんどの場合、マッピングで「not_analyzed」として構成する必要があります。それも検索していて、それでもトークン化したい場合は、multi fieldを使用して 2 つの異なる方法でインデックスを付けることができます。
また、full_name フィールドの一部である一意の用語の数によっては、この操作が高価になり、かなりのメモリが必要になる可能性があることも考慮する必要があります。
Elasticsearch 1.0 以降では、terms aggregation
これを行うために活用できます。
クエリ DSL:
{
"aggs": {
"NAME": {
"terms": {
"field": "",
"size": 10
}
}
}
}
実際の例:
{
"aggs": {
"full_name": {
"terms": {
"field": "authors",
"size": 0
}
}
}
}
次に、フィールドのすべての一意の値を取得できますauthors
。size=0 は、用語の数を制限しないことを意味します (これには es が 1.1.0 以降である必要があります)。
応答:
{
...
"aggregations" : {
"full_name" : {
"buckets" : [
{
"key" : "Ken",
"doc_count" : 10
},
{
"key" : "Jim Gray",
"doc_count" : 10
},
]
}
}
}
Elasticsearch 用語の集計を参照してください。
Elasticsearch 5.2.2 での作業
curl -XGET http://localhost:9200/articles/_search?pretty -d '
{
"aggs" : {
"whatever" : {
"terms" : { "field" : "yourfield", "size":10000 }
}
},
"size" : 0
}'
手段は"size":10000
(最大で)10000個の一意の値を取得します。これがないと、10 個を超える一意の値がある場合、10 個の値のみが返されます。
その"size":0
結果、"hits"
ドキュメントが含まれないことを意味します。デフォルトでは、10 個のドキュメントが返されますが、これは必要ありません。
参考:バケットターム集計
また、このページによると、ファセットは、ファセットのスーパーセットである Elasticsearch 1.0 の集約に置き換えられていることに注意してください。
次の理由により、既存の回答は Elasticsearch 5.X では機能しませんでした。
"size": 0
「[サイズ] は 0 より大きくなければならない」ため、解析に失敗しました。full_name
。ただし、未分析のkeyword
フィールドは集計に使用できます。解決策 1 : Scroll APIを使用します。検索コンテキストを保持し、複数のリクエストを行い、そのたびに結果の後続のバッチを返すことで機能します。Python を使用している場合、elasticsearch モジュールには、スクロールを処理してすべての結果を返すscan()
ヘルパー関数があります。
解決策 2 : Search After API を使用します。これは Scroll に似ていますが、検索コンテキストを保持する代わりにライブ カーソルを提供します。したがって、リアルタイムのリクエストではより効率的です。