在使用QueryStringQueryBuilder时,发现传入的搜索条件时,有时候会搜索出完全不包含该关键字的数据,翻阅了相关资料,发现是QueryStringQueryBuilder 使用的默认的分词导致的。
在没有给QueryStringQueryBuilder 指定特定的分词器时,ES会用默认的analyzer来处理,也就是名字(logical name)为
default
,
default_index
,
default_search
的analyzer。
ES内置的一些analyzer。
analyzer | logical name | description |
---|---|---|
standard analyzer | standard | standard tokenizer, standard filter, lower case filter, stop filter |
simple analyzer | simple | lower case tokenizer |
stop analyzer | stop | lower case tokenizer, stop filter |
keyword analyzer | keyword | 不分词,内容整体作为一个token(not_analyzed) |
pattern analyzer | whitespace | 正则表达式分词,默认匹配\W+ |
language analyzers |
lang |
各种语言 |
snowball analyzer | snowball | standard tokenizer, standard filter, lower case filter, stop filter, snowball filter |
custom analyzer | custom | 一个Tokenizer, 零个或多个Token Filter, 零个或多个Char Filter |
这个情况会使ES检索时,会对中文进行最小粒度的切分,例如:
new QueryStringQueryBuilder(“客服”).field(“title”).defaultOperator(Operator.AND);
则ES检索时,会将“客服” 拆分成 “客”,“服”,检索的结果为title中有 “客”,“服”两个字的即可,不需要两个字相邻,如果需要检索包含“客服”的,则需要写成:new QueryStringQueryBuilder(“\””+客服+”\””).field(“title”).defaultOperator(Operator.AND);
加上 双引号 表示强制要求 拆分一起
版权声明:本文为u013795975原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。