术语弹性查询未找到字母数字关键字文本的命中

term Elastic query not finding hit for alphanumeric keyword texts

在以下情况下,我将如何使用术语或术语弹性查询?

  1. 字段paidagentnumber的映射集如下

    "paidagentnumber": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    }
    
  2. GET statements_full/statements/_search?q=paidagentnumber:"017M0" 正在系统中找到 80 条记录

  3. 但是下面的GET没有得到任何记录

    GET statements_full/statements/_search
    {
      "query": {
        "term" : {"paidagentnumber":"017M0"} 
      }
    }
    
  4. 但是

    GET statements_full/statements/_search
    {
      "query": {
        "term" : {"paidagentnumber":"21212"} 
      }
    }

    正在寻找命中结果,即如果 paidagentnumber 字段中没有字母(只有数字),term 查询正在寻找命中。

paidagentnumber 字段被分析(因为它是 "type": "text"),所以它的内容将被分析器小写。 Term queries 没有被分析,它们被用来,according to the docs,找到"the exact term specified in the inverted index",所以这个小写分析不会应用到查询中,因此两者之间不匹配。 “017M0”与“017m0”不完全匹配。

这里有选项:

  • 使用一个query_string query。这与 q 参数创建的查询类型相同,因此如果它按您想要的方式工作,请使用:

    "query": { 
      "query_string" : { 
        "query": "paidagentnumber:017M0" 
      } 
    }
    
  • 如果要使用术语查询,请使用关键字字段。您已经在此处创建了一个,因此只需搜索 paidagentnumber.keyword 字段即可。

    "query": { 
      "term" : {
        "paidagentnumber.keyword": "017M0"
      } 
    }
    

    如果您一开始真的不想对 paidagentnumber 字段进行任何类型的文本分析,那么您也可以从其定义中删除 text 类型:

    "paidagentnumber": {
      "type": "keyword",
      "ignore_above": 256
    }