如何在弹性搜索中查询不区分大小写的字符串

时间:2019-07-16 04:13:26

标签: elasticsearch query-string

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

我有数据

{
"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*"
          }
        }
    }

  }

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

1 个答案:

答案 0 :(得分:1)

由于您的问题尚不清楚,根据上下文,我假设要在哪个字段上进行不区分大小写的搜索。

为什么您的解决方案不起作用:请注意,keyword字段并未按原样在Elasticsearch中进行分析和编制索引,因此对于您的字段SID.keyword您正在提供其值SID.keyword,因此它将按原样存储,不会仅创建一个与提供的值完全相同的令牌。

现在您正在使用121213-13131-_X现场query_string,因此您的query string将使用为该字段配置的同一分析器,即keyword analyzer,再次没有-op分析器,因此不会小写查询中提供的SID.keyword

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