在Elasticsearch搜索中使用通配符和必需的运算符

时间:2013-07-25 11:44:02

标签: lucene elasticsearch

我们的Elasticsearch索引中有各种包含文本

的行
  

“...... 2%牛奶......”。

用户在搜索字段中输入“2%milk”之类的查询,然后将其内部转换为查询

title:(+milk* +2%*)

因为所有条款都是必需的,我们可能会对包含“2%乳脂”的行感兴趣。

此查询返回零点击。将查询更改为

title:(+milk* +2%)

返回合理的结果。那么为什么第一个查询中的'*'运算符不起作用?

2 个答案:

答案 0 :(得分:2)

除非您设置映射,否则将在标记化过程中删除“%”符号。基本上“2%牛奶”会变成代币2milk

当您搜索“2%*”时,它会搜索代码,例如:2%2%a2%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*

防止通配符查询的标记化确实有意义,因为不允许使用通配符短语查询。如果允许标记化,那么它似乎会提出问题,特别是嵌入的通配符,以及通配符可以跨越多少个术语。