如何在Elasticsearch中对关键字字段进行不区分大小写的搜索而无需重新索引?

k2fxgqgv  于 2023-11-17  发布在  ElasticSearch
关注(0)|答案(2)|浏览(231)

我有一个这样的关键字字段:

"address": {
   "type": "keyword"
}

字符串
该值是用 Camel 大小写写的,因为它是为了显示。例如“1/10 Somewhere Rd,Somewhere AAA 3333”
现在,我想对该字段进行不区分大小写的 * 搜索 *,理想情况下不需要重新索引整个索引
到目前为止,我发现match可以用于不区分大小写的搜索,但只适用于text字段。
我唯一的选择是重新索引,例如通过一个text字段,或者使用一个自定义规范器/分析器?有什么方法可以不重新索引吗?

zpjtge22

zpjtge221#

你是对的,match查询可以用于不区分大小写的搜索,因为它应用了索引时使用的相同分析器,但只适用于text字段。
这里的问题是,在索引时,由于您使用了keyword字段,因此用于匹配搜索查询标记的elasticsearch倒排索引中的标记不是lowercased,因此根本不可能提供大小写不敏感的搜索。
让我们用一个例子来理解上面的声明:
假设你的文档中有Foo BAR,你使用keyword字段索引它。请注意每个字符的大小写,所以倒排索引将有下面的标记。
Foo BAR,现在在查询时通过一些钩或钩,您可以将搜索词转换为全搜索或全搜索,但在这种情况下,它仍然不会匹配标记,所以您仍然会在搜索结果中遇到很多问题。

我建议,添加一个新的字段,它使用text,并使用reindex API创建一个新的索引,并以干净的方式实现它,也使用reindex API,您可以从旧索引构建一个新的索引,并且构建新索引要快得多,而不是从真实源(大多数情况下是SQL)构建。

rekjcdws

rekjcdws2#

从7.10版开始,术语查询支持case_insensitive参数

GET /_search
{
  "query": {
    "term": {
      "user.id": {
        "value": "kimchy",
        "case_insensitive": true
      }
    }
  }
}

字符串
但是,从v8.10开始,Terms query不支持case_insensitive
我发现的最好的方法是this,它使用了一个规范化器,在索引时将字符串小写。这样你就可以使用任何支持规范化的查询,并获得不区分大小写的匹配。

相关问题