Elasticsearch QueryStringQueryBuilder 检索问题

在使用QueryStringQueryBuilder时,发现传入的搜索条件时,有时候会搜索出完全不包含该关键字的数据,翻阅了相关资料,发现是QueryStringQueryBuilder 使用的默认的分词导致的。

在没有给QueryStringQueryBuilder 指定特定的分词器时,ES会用默认的analyzer来处理,也就是名字(logical name)为defaultdefault_indexdefault_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);

加上 双引号 表示强制要求 拆分一起

你可能感兴趣的:(Elasticsearch)