kir*_*ran 30 search elasticsearch
如何使用Elasticsearch搜索给定字段的所有唯一值?
我有这样的查询select full_name from authors,所以我可以在表单上向用户显示列表.
Gar*_*auh 12
对于Elasticsearch 1.0及更高版本,您可以利用terms aggregation这一点,
查询DSL:
{
"aggs": {
"NAME": {
"terms": {
"field": "",
"size": 10
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
一个真实的例子:
{
"aggs": {
"full_name": {
"terms": {
"field": "authors",
"size": 0
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以获得所有独特的authors字段值.size = 0表示不限制术语数(这要求es为1.1.0或更高版本).
响应:
{
...
"aggregations" : {
"full_name" : {
"buckets" : [
{
"key" : "Ken",
"doc_count" : 10
},
{
"key" : "Jim Gray",
"doc_count" : 10
},
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
直觉: 用 SQL 术语来说:
Select distinct full_name from authors;
相当于
Select full_name from authors group by full_name;
因此,我们可以使用 ElasticSearch 中的分组/聚合语法来查找不同的条目。
假设以下是存储在elasticsearch中的结构:
[{
"author": "Brian Kernighan"
},
{
"author": "Charles Dickens"
}]
Run Code Online (Sandbox Code Playgroud)
什么不起作用: 简单聚合
{
"aggs": {
"full_name": {
"terms": {
"field": "author"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
{
"error": {
"root_cause": [
{
"reason": "Fielddata is disabled on text fields by default...",
"type": "illegal_argument_exception"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
神奇之处在于:在字段中 附加.keyword
{
"aggs": {
"full_name": {
"terms": {
"field": "author.keyword"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例输出可能是:
{
"aggregations": {
"full_name": {
"buckets": [
{
"doc_count": 372,
"key": "Charles Dickens"
},
{
"doc_count": 283,
"key": "Brian Kernighan"
}
],
"doc_count": 1000
}
}
}
Run Code Online (Sandbox Code Playgroud)
额外提示:
让我们假设相关字段嵌套如下:
[{
"authors": [{
"details": [{
"name": "Brian Kernighan"
}]
}]
},
{
"authors": [{
"details": [{
"name": "Charles Dickens"
}]
}]
}
]
Run Code Online (Sandbox Code Playgroud)
现在正确的查询变为:
{
"aggregations": {
"full_name": {
"aggregations": {
"author_details": {
"terms": {
"field": "authors.details.name"
}
}
},
"nested": {
"path": "authors.details"
}
}
},
"size": 0
}
Run Code Online (Sandbox Code Playgroud)
为 Elasticsearch 5.2.2 工作
curl -XGET http://localhost:9200/articles/_search?pretty -d '
{
"aggs" : {
"whatever" : {
"terms" : { "field" : "yourfield", "size":10000 }
}
},
"size" : 0
}'
Run Code Online (Sandbox Code Playgroud)
该"size":10000方式获得(最多)10000个独特的价值观。如果没有这个,如果您有 10 个以上的唯一值,则只返回 10 个值。
"size":0结果的意思是,"hits"将不包含任何文件。默认情况下,返回 10 个文档,这是我们不需要的。
参考:桶项聚合
另请注意,根据此页面,方面已被 Elasticsearch 1.0 中的聚合取代,聚合是方面的超集。