Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Elasticsearch查询字段的所有唯一值_Search_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Search,elasticsearch" /> elasticsearch,Search,elasticsearch" />

使用Elasticsearch查询字段的所有唯一值

使用Elasticsearch查询字段的所有唯一值,search,elasticsearch,Search,elasticsearch,如何使用Elasticsearch搜索给定字段的所有唯一值 我有这样一种查询,比如从作者那里选择全名,这样我就可以在表单上向用户显示列表。您可以在“全名”字段上进行搜索。但是为了正确地做到这一点,您需要确保在索引时没有对其进行标记化,否则facet中的每个条目都将是一个不同的术语,它是字段内容的一部分。您很可能需要在映射中将其配置为“未分析”。如果您也在搜索它,并且仍然希望标记它,那么您可以使用两种不同的方法对它进行索引 您还需要考虑到,根据全名字段中唯一术语的数量,此操作可能非常昂贵,并且需要

如何使用Elasticsearch搜索给定字段的所有唯一值

我有这样一种查询,比如
从作者那里选择全名
,这样我就可以在表单上向用户显示列表。

您可以在“全名”字段上进行搜索。但是为了正确地做到这一点,您需要确保在索引时没有对其进行标记化,否则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。。。