elasticsearch,使用normalizer优化keyword字段的查询
发布网友
发布时间:2024-09-30 21:19
我来回答
共1个回答
热心网友
时间:2024-12-10 13:53
在elasticsearch中,使用keyword类型字段索引结构化数据时,原始值直接保留,未经预处理。当我们尝试查询包含关键词的文档时,es首先获取该字段的类型,并调用termQuery构建查询语句。然而,对于keyword字段,直接调用父类TermBasedFieldType的termQuery方法,此方法使用indexedValueForSearch对查询关键字进行处理。此过程中,KeywordFieldMapper实现了indexedValueForSearch,但由于在初始化时使用了Lucene.KEYWORD_ANALYZER,因此未进行任何处理,导致搜索大小写不敏感的问题。
解决方法在于利用keyword类型提供的normalizer配置参数,在索引前进行预处理工作。通过自定义normalizer,可以定义character filters和token filters,比如使用lowercase token filter来实现忽略大小写。在CustomNormalizerProvider中,解析配置的字符过滤器和令牌过滤器,组合生成自定义分析器。在生成字段mapper时,根据配置的normalizer名称获取对象并设置为字段类型的normalizer和搜索分析器。
当索引文档时,获取keyword字段类型的normalizer,对值进行处理。而搜索时,由于已重置了searchAnalyzer为自定义的normalizer,直接调用normalize方法处理输入关键字。最终,无论输入的关键字大小写如何,都能搜索到相应结果。