我们的Elasticsearch索引中有各种包含文本
的行“...... 2%牛奶......”。
用户在搜索字段中输入“2%milk”之类的查询,然后将其内部转换为查询
title:(+milk* +2%*)
因为所有条款都是必需的,我们可能会对包含“2%乳脂”的行感兴趣。
此查询返回零点击。将查询更改为
title:(+milk* +2%)
返回合理的结果。那么为什么第一个查询中的'*'运算符不起作用?
答案 0 :(得分:2)
除非您设置映射,否则将在标记化过程中删除“%”符号。基本上“2%牛奶”会变成代币2
和milk
。
当您搜索“2%*”时,它会搜索代码,例如:2%
,2%a
,2%b
等...并且不匹配任何索引标记,不会发出任何匹配
当您搜索“2%”时,它将经历与索引时相同的标记化过程(您可以指定此标识,但默认标记化是相同的),您将查找与标记匹配的文档{ {1}},会给你一个打击。
您可以read more about the analysis/tokenization process here并且可以按defining a custom mapping
设置所需的分析 祝你好运!答案 1 :(得分:0)
前缀和通配符查询似乎不会将Analyzer应用于其内容。举几个例子:
title:(+milk* +2%)
- > +title:milk* +title:2
title:(+milk* +2%*)
- > +title:milk* +title:2%*
title:(+milk* +2%3)
- > +title:milk* +(title:2 title:3)
title:(+milk* +2%3*)
- > +title:milk* +title:2%3*
+title:super\\-milk
- > +title:super title:milk
+title:super\\-milk*
- > +title:super-milk*
防止通配符查询的标记化确实有意义,因为不允许使用通配符短语查询。如果允许标记化,那么它似乎会提出问题,特别是嵌入的通配符,以及通配符可以跨越多少个术语。