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

How to do a case-insensitive search on a keyword field in Elasticsearch without reindexing?

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

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

该值以驼峰式书写,因为它是为了显示。例如“1/10 Somewhere Rd, Somewhere AAA 3333”

现在,我想对该字段进行不区分大小写的 搜索,最好是 不重新索引整个索引

到目前为止我发现 match 可用于不区分大小写的搜索,但仅适用于 text 个字段。

我唯一的选择是重建索引,例如通过 text 字段,还是使用 lowercase/custom normalizer/analyser? 没有 重新索引的任何方法?

你是对的,match 查询可用于 case-insensitive 搜索,因为它应用了在索引时使用的相同分析器,但仅适用于 text 字段。

这里的问题是,在建立索引时,由于您使用了 keyword 字段,因此用于匹配搜索查询标记的 elasticsearch 倒排索引中的标记不是 lowercased 所以它是根本无法提供 case-insensitive 搜索。

让我们用一个例子来理解上面的说法:

假设您的文档中有 Foo BAR,您使用 keyword 字段对其进行了索引。 请注意每个字符的大小写,因此倒排索引将具有以下标记。

Foo BAR,现在在某些不法分子的查询时,您可以将搜索词转换为全部大写或小写,但在这种情况下它仍然不会匹配标记,因此您仍然有搜索结果中有很多问题。

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