使用Elasticsearch查询字段的所有唯一值
如何使用Elasticsearch搜索给定字段的所有唯一值 我有这样一种查询,比如使用Elasticsearch查询字段的所有唯一值,search,
elasticsearch,Search,
elasticsearch,如何使用Elasticsearch搜索给定字段的所有唯一值 我有这样一种查询,比如从作者那里选择全名,这样我就可以在表单上向用户显示列表。您可以在“全名”字段上进行搜索。但是为了正确地做到这一点,您需要确保在索引时没有对其进行标记化,否则facet中的每个条目都将是一个不同的术语,它是字段内容的一部分。您很可能需要在映射中将其配置为“未分析”。如果您也在搜索它,并且仍然希望标记它,那么您可以使用两种不同的方法对它进行索引 您还需要考虑到,根据全名字段中唯一术语的数量,此操作可能非常昂贵,并且需要
从作者那里选择全名
,这样我就可以在表单上向用户显示列表。您可以在“全名”字段上进行搜索。但是为了正确地做到这一点,您需要确保在索引时没有对其进行标记化,否则facet中的每个条目都将是一个不同的术语,它是字段内容的一部分。您很可能需要在映射中将其配置为“未分析”。如果您也在搜索它,并且仍然希望标记它,那么您可以使用两种不同的方法对它进行索引
您还需要考虑到,根据全名字段中唯一术语的数量,此操作可能非常昂贵,并且需要相当多的内存。对于Elasticsearch 1.0及更高版本,您可以利用
术语聚合来完成此操作
查询DSL:
{
"aggs": {
"NAME": {
"terms": {
"field": "",
"size": 10
}
}
}
}
一个真实的例子:
{
"aggs": {
"full_name": {
"terms": {
"field": "authors",
"size": 0
}
}
}
}
然后可以获得作者
字段的所有唯一值。
size=0表示不限制术语的数量(这要求es为1.1.0或更高版本)
答复:
{
...
"aggregations" : {
"full_name" : {
"buckets" : [
{
"key" : "Ken",
"doc_count" : 10
},
{
"key" : "Jim Gray",
"doc_count" : 10
},
]
}
}
}
请参阅。现有答案在Elasticsearch 5.X中不适用,原因如下:
- 我需要在索引时标记我的输入
“大小”:0
分析失败,因为“[size]必须大于0。”
- 这意味着默认情况下,您无法在
全名
字段中搜索。但是,未分析的关键字
字段可用于聚合
解决方案1:使用。它的工作原理是保留一个搜索上下文并发出多个请求,每次都返回后续批次的结果。如果您使用的是Python,elasticsearch模块可以为您处理滚动并返回所有结果
解决方案2:使用。它类似于滚动,但提供了一个实时光标,而不是保留搜索上下文。因此,它对于实时请求更有效。用于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中,facets已被聚合所取代,聚合是facets的超集。直觉:
用SQL的说法:
从作者中选择不同的全名代码>
相当于
按全名从作者组中选择全名代码>
因此,我们可以在ElasticSearch中使用分组/聚合语法来查找不同的条目
假设以下是弹性搜索中存储的结构:
[{
"author": "Brian Kernighan"
},
{
"author": "Charles Dickens"
}]
什么不起作用:普通聚合
{
"aggs": {
"full_name": {
"terms": {
"field": "author"
}
}
}
}
我收到以下错误:
{
"error": {
"root_cause": [
{
"reason": "Fielddata is disabled on text fields by default...",
"type": "illegal_argument_exception"
}
]
}
}
什么像符咒一样有效:在字段中添加.keyword
{
"aggs": {
"full_name": {
"terms": {
"field": "author.keyword"
}
}
}
}
并且示例输出可以是:
{
"aggregations": {
"full_name": {
"buckets": [
{
"doc_count": 372,
"key": "Charles Dickens"
},
{
"doc_count": 283,
"key": "Brian Kernighan"
}
],
"doc_count": 1000
}
}
}
奖金提示:
{
"aggregations": {
"full_name": {
"buckets": [
{
"doc_count": 372,
"key": "Charles Dickens"
},
{
"doc_count": 283,
"key": "Brian Kernighan"
}
],
"doc_count": 1000
}
}
}
假设所讨论的字段嵌套如下:
[{
"authors": [{
"details": [{
"name": "Brian Kernighan"
}]
}]
},
{
"authors": [{
"details": [{
"name": "Charles Dickens"
}]
}]
}
]
现在,正确的查询变成:
{
"aggregations": {
"full_name": {
"aggregations": {
"author_details": {
"terms": {
"field": "authors.details.name"
}
}
},
"nested": {
"path": "authors.details"
}
}
},
"size": 0
}
full_name是什么意思?@neustrat47 full_name只是聚合的名称。我不确定这是否能解决“大小”:0的问题,因为从文档中我看到的默认值是10。。。