首页 > 解决方案 > 为什么这个弹性搜索查询不返回任何内容

问题描述

我执行了以下elasticsearch查询。

GET amasyn/_search
{
    "query": {
        "bool" : {
            "filter" : {
                "term": {"ordernumber": "112-9550919-9141020"}
            }
        }
    }
}

但它没有得到任何点击

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

但是我有一个文档ordernumber在索引中有这个。 ordernumber是一个文本字段。

当我通过替换来更改上述查询termmatch,我得到的总命中数作为给定查询的命中数。请解释这里发生了什么以及如何解决这个问题。

标签: elasticsearchelasticsearch-query

解决方案


这是因为由于您使用ordernumber类型为文本的字段,因此正在对其进行分析。请通过此答案参考 text 和 keyword之间的区别 Difference between keyword and text in ElasticSearch

ordernumber通过这种方式,您可以为您的字段定义文本和关键字。

映射

{
    "mappings": {
        "properties": {
            "ordernumber": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}

然后您可以使用术语查询,如下所示:

{
    "query": {
        "bool" : {
            "filter" : {
                "term": {"ordernumber.keyword": "112-9550919-9141020"}
            }
        }
    }
}

请参阅如何为您的文本标记字段text和字段。keyword

标准分析仪

当您将字段定义为text.

{
    "analyzer": "standard",
    "text" : "112-9550919-9141020"
}

结果 :

 {
        "tokens": [
            {
                "token": "112",
                "start_offset": 0,
                "end_offset": 3,
                "type": "<NUM>",
                "position": 0
            },
            {
                "token": "9550919",
                "start_offset": 4,
                "end_offset": 11,
                "type": "<NUM>",
                "position": 1
            },
            {
                "token": "9141020",
                "start_offset": 12,
                "end_offset": 19,
                "type": "<NUM>",
                "position": 2
            }
        ]
    }

关键字分析器

当您将字段定义为keyword.

{
    "analyzer": "keyword",
    "text" : "112-9550919-9141020"
}

结果

 {
        "tokens": [
            {
                "token": "112-9550919-9141020",
                "start_offset": 0,
                "end_offset": 19,
                "type": "word",
                "position": 0
            }
        ]
    }

推荐阅读