我有一个这样的关键字字段:
"address": {
"type": "keyword"
}
字符串
该值是用 Camel 大小写写的,因为它是为了显示。例如“1/10 Somewhere Rd,Somewhere AAA 3333”
现在,我想对该字段进行不区分大小写的 * 搜索 *,理想情况下不需要重新索引整个索引。
到目前为止,我发现match
可以用于不区分大小写的搜索,但只适用于text
字段。
我唯一的选择是重新索引,例如通过一个text
字段,或者使用一个自定义规范器/分析器?有什么方法可以不重新索引吗?
2条答案
按热度按时间zpjtge221#
你是对的,
match
查询可以用于不区分大小写的搜索,因为它应用了索引时使用的相同分析器,但只适用于text
字段。这里的问题是,在索引时,由于您使用了
keyword
字段,因此用于匹配搜索查询标记的elasticsearch倒排索引中的标记不是lowercased
,因此根本不可能提供大小写不敏感的搜索。让我们用一个例子来理解上面的声明:
假设你的文档中有
Foo BAR
,你使用keyword
字段索引它。请注意每个字符的大小写,所以倒排索引将有下面的标记。Foo BAR
,现在在查询时通过一些钩或钩,您可以将搜索词转换为全搜索或全搜索,但在这种情况下,它仍然不会匹配标记,所以您仍然会在搜索结果中遇到很多问题。我建议,添加一个新的字段,它使用
text
,并使用reindex API创建一个新的索引,并以干净的方式实现它,也使用reindex API,您可以从旧索引构建一个新的索引,并且构建新索引要快得多,而不是从真实源(大多数情况下是SQL)构建。rekjcdws2#
从7.10版开始,术语查询支持
case_insensitive
参数字符串
但是,从v8.10开始,Terms query不支持
case_insensitive
。我发现的最好的方法是this,它使用了一个规范化器,在索引时将字符串小写。这样你就可以使用任何支持规范化的查询,并获得不区分大小写的匹配。