首页 > 解决方案 > 术语弹性查询未找到字母数字关键字文本的匹配项

问题描述

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

  1. 该字段的映射集paidagentnumber如下

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

  3. 但以下GET没有得到任何记录

    获取 statements_full/statements/_search
    {
      “询问”: {
        “期限”:{“付费代理号码”:“017M0”}
      }
    }
    
  4. 获取 statements_full/statements/_search
    {
      “询问”: {
        “期限”:{“付费代理号码”:“21212”}
      }
    }

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

标签: elasticsearchsearchlucenekeyword

解决方案


paidagentnumber字段被分析(因为它是"type": "text"),因此它的内容将被分析器小写。术语查询不被分析,根据文档,它们用于查找“倒排索引中指定的确切术语”,因此这种小写分析不会应用于查询,因此两者之间的不匹配。“017M0”与“017m0”不完全匹配。

您可以在这里选择:

  • 使用query_string 查询。这是q参数创建的同一类型的查询,因此如果按您的意愿工作,请使用:

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

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

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

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

推荐阅读