【问题标题】:How to do a case-insensitive search on a keyword field in Elasticsearch without reindexing?如何在不重新索引的情况下对 Elasticsearch 中的关键字字段进行不区分大小写的搜索?
【发布时间】:2022-03-27 00:42:14
【问题描述】:

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

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

该值以驼峰形式编写,因为它旨在用于显示。例如“1/10 Somewhere Rd, Somewhere AAA 3333”

现在,我想对该字段进行不区分大小写的搜索,理想情况下不重新索引整个索引

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

我唯一的选择是重新索引,例如通过text 字段,还是使用小写/自定义规范器/分析器?我有什么方法可以做到重新索引?

【问题讨论】:

  • 非常感谢您接受答案,很高兴它对您有帮助,如果您能对答案进行投票,那就太好了,在此先感谢 :)
  • @Opster 感谢您的回答,但这是我已经知道的东西,而不是问题的实际答案。但我接受了完整性的答案.. 谢谢。

标签: elasticsearch elasticsearch-query


【解决方案1】:

您是对的,match 查询可用于不区分大小写的搜索,因为它应用了在索引时使用的相同分析器,但仅适用于 text 字段。

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

让我们通过一个例子来理解上面的语句:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2021-12-31
    相关资源
    最近更新 更多