Atlas Search Index部分匹配异常:查询返回多余结果原因咨询
问题原因
你用的lucene.standard分词器会把连字符-当成分词分隔符,对所有文本做拆分处理:
- 第一条文档的
sku: 'kw-lids-0009'会被拆成kw、lids、0009三个独立词项 - 第二条文档的
sku: 'kw-fs66-gre'会被拆成kw、fs66、gre三个独立词项 - 你的查询字符串
'kw-fs'同样会被拆成kw和fs两个词项
MongoDB的$search文本查询默认是只要匹配任意一个词项就会返回文档,两个文档都包含kw这个词项,所以自然会返回两条结果。
解决方法
要实现只返回sku以kw-fs开头的文档,可以试试这几种方案:
方案1:修改索引为keyword类型
把sku字段的分词器改成lucene.keyword,这样整个sku字符串会被作为单个词项存储,不会被拆分:
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "sku": { "type": "string", "analyzer": "lucene.keyword" } } } }
之后用前缀查询匹配:
[{ $search: { index: 'test', prefix: { query: 'kw-fs', path: 'sku' } } }]
方案2:使用wildcard查询
不需要修改现有索引,直接用wildcard查询匹配前缀:
[{ $search: { index: 'test', wildcard: { query: 'kw-fs*', path: 'sku' } } }]
*会匹配kw-fs之后的任意字符,而且wildcard查询不会对查询字符串做分词处理,刚好符合你的需求。
内容的提问来源于stack exchange,提问作者Stefano Sala
相关产品推荐
相关产品推荐

