SOLR分面(Facet)响应同义词异常展开问题咨询
问题原因分析
这个问题的核心是分面字段size的查询分析器中包含了同义词过滤器,导致SOLR在生成分面结果时,对字段值执行了同义词扩展操作。
当执行分面查询时,SOLR默认会使用该字段的查询分析器处理分面项。你的同义词配置1,1ft,1feet会让分析器把原始值"1"扩展为"1"、"1ft"、"1feet"三个词项,这些词项都会被当作独立的分面条目返回,而它们对应的文档集合完全一致(都是包含"1"的文档),所以计数完全相同。
解决方案
针对这个问题,有几种可行的解决方式:
1. 禁用分面字段的分析器
在查询时,通过参数强制关闭分面字段的分析逻辑,直接基于原始存储值生成分面:
http://localhost:8983/solr/techproducts/select?q=*:*&facet=true&facet.field=size&f.size.facet.analyze=false&rows=0
添加f.size.facet.analyze=false后,SOLR不会对size字段的分面值执行分析,自然不会触发同义词扩展。
2. 使用DocValues进行分面
如果你的size字段已经配置了docValues="true"(推荐用于分面的字段都开启DocValues),可以指定分面使用DocValues,避免分析器介入:
http://localhost:8983/solr/techproducts/select?q=*:*&facet=true&facet.field=size&f.size.facet.method=dv&rows=0
DocValues存储的是字段的原始值(或预处理后的原始值,不包含同义词扩展),用它生成分面会直接返回原始的字段值。
3. 创建专用分面字段
在schema中创建一个不带同义词过滤器的字段(比如size_facet),仅用于分面:
<field name="size_facet" type="string" indexed="true" stored="false" docValues="true"/>
然后在索引时,将size的原始值同步到size_facet字段,分面时使用这个字段:
http://localhost:8983/solr/techproducts/select?q=*:*&facet=true&facet.field=size_facet&rows=0
这种方式可以保证搜索时的同义词扩展不受影响,同时分面只返回原始值。
内容的提问来源于stack exchange,提问作者Pasupathi Rajamanickam
相关产品推荐
相关产品推荐

