术语弹性查询找不到字母数字关键字文本的匹配项

时间:2018-08-15 21:45:02

标签: elasticsearch search lucene keyword

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

  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查询正在查找匹配结果。

1 个答案:

答案 0 :(得分:0)

paidagentnumber字段进行了分析(因为它是"type": "text"),因此分析器将其内容小写。不分析术语查询,而是使用according to the docs来查找“倒排索引中指定的精确术语”,因此该下大写分析将不会应用于查询,因此两者之间的不匹配。 “ 017M0”与“ 017m0”不完全匹配。

您在这里有选择

  • 使用query_string query。这与q参数创建的查询类型相同,因此,如果您需要的话,请使用该查询:

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

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

    如果您首先真的不想在payedagentnumber字段上进行任何形式的文本分析,则可以从其定义中消除text类型:

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