【问题标题】:elasticsearch match vs term query弹性搜索匹配与术语查询
【发布时间】:2014-06-02 18:13:45
【问题描述】:

我使用匹配查询搜索“request.method”:“GET”:

    {
      "query": {
        "filtered": {
          "query": {
            "match": {
              "request.method": "GET"
            }
          },
          "filter": {
            "bool": {
              "must": [
...

正如所料,Match查询可以得到结果,如下图:

但问题是使用 Term 查询时,没有结果。

更新查询以将“match”更改为“term”,并保持其他部分保持不变:

{
  "query": {
    "filtered": {
      "query": {
        "term": {
          "request.method": "GET"
        }
      },
      "filter": {
        "bool": {
          "must": [
...

我认为 Term 查询是 Match 查询的“未分析”版本。如上图所示,至少有一条记录的“request.method”等于“GET”。为什么上述Term查询没有结果?谢谢。

【问题讨论】:

  • 在术语查询中尝试将get指定为小写
  • 你明白了。谢谢。

标签: elasticsearch


【解决方案1】:

假设您使用的是Standard Analyzer GET 在存储在索引中时变为get。源文档仍将具有原始“GET”。

match 查询将对搜索词应用相同的标准分析器,因此将匹配索引中存储的内容。 term 查询不会对搜索词应用任何分析器,因此只会在倒排索引中查找确切的词。

要在您的示例中使用术语查询,请将大写“GET”更改为小写“get”或更改您的映射,以便将 request.method 字段设置为 not_analyzed

【讨论】:

  • 或将request.method 字段的映射更改为键入keyword
【解决方案2】:

elasticsearch中term和match的区别

术语是精确查询

匹配是一个模糊查询

term 是完美匹配,即精确查询。搜索词在搜索之前不会被切分,所以我们的搜索词必须是文档切分集之一。假设我们要查找所有标题为 Jesus Verma 的文件。

 $curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query":{
    "term":{
"title": "Jesus Verma"
    }
  }
}'

匹配查询会首先对搜索词进行分类。分词后,分词结果会一一匹配。因此,与term的精确搜索相比,match是一种分词匹配搜索,而match搜索有两种功能相似的变体。一是match_phrase。一种是multi_match

$curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match": {
 "content": "Banglore, India"
        }
    }
}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多