首页 > 解决方案 > 如何在弹性搜索中查询不区分大小写的字符串

问题描述

我正在寻找两个字段中的数据,其中一个字段必须相同,一个使用查询

我有数据

{
"NUMBER" : "5587120",
"SID" : "121213-13131-_X",
"ADDRESS" : "purwakarta"
}

我试过使用这样的查询字符串

GET test/_doc/_search
{
  "query" : {
    "bool" : {
      "must" : [
        {"match" : {"NUMBER" : "5587120"}}
        ],
        "filter" : {
          "query_string" : {
            "default_field" : "SID.keyword",
            "query" : "*X*"
          }
        }
    }

  }

当我输入与记录相同的文本时,会出现我想要的数据,但是当我用小写写文本时,数据不会出现

标签: elasticsearchquery-string

解决方案


由于您的问题尚不清楚,您希望根据上下文在哪个字段上进行不区分大小写的搜索,我假设它是该SID.keyword字段。

为什么您的解决方案不起作用:请注意,关键字字段不会按原样在 elasticsearch 中分析和索引,因此如果您的字段SID.keyword提供其值121213-13131-_X以便按原样存储,它不会只创建一个令牌与提供的值完全相同。

现在您正在使用query_stringon-field SID.keyword,因此您的查询字符串将使用为字段配置的相同分析器,即关键字分析器,它也是无操作分析器,因此不会小写*X*查询中提供的内容。

解决方案:如果您想要insensitive搜索而不是使用该SID.keyword字段,只需创建一个使用该keyword分析器的自定义分析器,然后将其传递给lowercase令牌过滤器,因此您121213-13131-_X将转换为121213-13131-_x(注意小写x)。然后您的查询字符串也将使用相同的分析器,并将匹配文档,因为最终 elasticsearch 对令牌匹配起作用


推荐阅读