OpenSearch无法过滤聚合字段问题求助(Magento2场景)
解决Magento2中OpenSearch筛选sold_by字段返回0结果的问题
直接解决方案
把过滤和聚合的字段从option_text_sold_by换成option_text_sold_by.untouched,就能正常匹配到数据了。
问题原因
option_text_sold_by是text类型,OpenSearch会自动对该字段内容做分词处理。比如你索引的seller-123,会被拆成seller和123两个独立词汇,用完整字符串seller-123过滤时,匹配不到分词后的内容,所以返回0结果。- 而
untouched是text字段下的keyword子字段,它会完整保留原始字符串(不会分词),和能正常工作的type_id字段类型一致,用来做精确匹配、过滤、聚合都能准确命中数据。
具体查询示例
错误的过滤查询(返回0结果)
{ "query": { "term": { "option_text_sold_by": "seller-123" } } }
正确的过滤查询
{ "query": { "term": { "option_text_sold_by.untouched": "seller-123" } } }
正确的聚合查询
{ "aggs": { "store_sellers": { "terms": { "field": "option_text_sold_by.untouched" } } } }
Magento2场景下的代码调整
如果是在Magento代码里构建搜索条件,比如使用SearchCriteria或调用OpenSearch客户端,只需把字段名指定为option_text_sold_by.untouched:
// 原来的错误写法 $filter = $filterBuilder->setField('option_text_sold_by') ->setValue('seller-123') ->setConditionType('eq') ->create(); // 正确写法 $filter = $filterBuilder->setField('option_text_sold_by.untouched') ->setValue('seller-123') ->setConditionType('eq') ->create();
可选优化方案
如果不需要对option_text_sold_by做全文检索,仅需精确匹配,可以修改该字段的映射,把主类型改成keyword。但这样会失去text类型的分词搜索能力,若有全文检索需求,建议还是用untouched子字段。
内容的提问来源于stack exchange,提问作者asta6
相关产品推荐
相关产品推荐

