我们的 Elasticsearch 索引中有多个包含文本的行
"... 2% milk ...".
用户在搜索字段中输入“2% 牛奶”等查询,我们在内部将其转换为查询
title:(+milk* +2%*)
因为所有术语都应该是必需的,并且我们可能对包含“2% 乳脂”的行感兴趣。
上面的查询返回零命中。将查询更改为
title:(+milk* +2%)
返回合理的结果。那么为什么第一个查询中的“*”运算符不起作用?
最佳答案
除非您设置映射,否则“%”符号将在标记化过程中被删除。基本上“2% 牛奶”将变成标记 2
和 milk
。
当您搜索“2%*”时,它会查找以下标记:2%
、2%a
、2%b
、等等...并且不匹配任何索引标记,没有命中。
当您搜索“2%”时,它将经历与索引时相同的标记化过程(您可以指定这一点,但默认标记化是相同的),并且您将查找与标记匹配的文档2
,这会给你带来打击。
您可以read more about the analysis/tokenization process here您可以通过 defining a custom mapping 设置您想要的分析
祝你好运!
关于lucene - 在 Elasticsearch 搜索中使用通配符和必需运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17857088/