如何在Solr中实现带boosting的部分短语匹配
Shingle适配性说明
Shingle完全适配该场景,它可以在索引阶段生成指定长度的相邻词组合(N元短语),天然支持不同长度短语的匹配和加权需求。除了Shingle方案外,也可以直接使用edismax查询解析器自带的多短语加权参数实现需求,无需修改索引结构,落地成本更低。
方案1:无需修改索引的edismax原生配置方案(优先推荐)
该方案利用edismax内置的pf3(3元短语加权)、pf2(2元短语加权)参数,直接对不同长度的查询短语分配权重即可满足排序要求,无需调整索引结构。
调整后的查询参数示例
https://localhost:8983/solr/app_index/select? defType=edismax& tie=0.01& q=userinput& qf=bodycontent_t Title Desc& pf3=Title^50 Desc^30& pf2=Title^20 Desc^10& qs=2
参数说明
pf3:对查询词拆分后生成的所有连续3元短语匹配的结果加权,给最高权重保证完整3元短语排在最前pf2:对查询词拆分后生成的所有连续2元短语匹配的结果加权,权重低于3元短语,保证2元匹配结果在单字匹配之前qf:指定所有参与查询的字段,替代原来单独限定bodycontent_t的逻辑,保证多字段都参与匹配qs:短语查询的允许slop,可按需求调整短语间允许的词间距
方案2:Shingle配置方案
如果需要更高的短语匹配查询性能,可通过配置Shingle过滤器改造索引结构,步骤如下:
步骤1:配置带Shingle的字段类型
在managed-schema(或schema.xml)中新增带Shingle过滤的字段类型,示例配置如下:
<fieldType name="text_shingle" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
步骤2:修改字段类型关联
将Title、Desc、bodycontent_t字段的type调整为上面定义的text_shingle,重新导入全量数据生成索引。
步骤3:查询加权配置
在查询参数中给不同长度的Shingle短语分配对应权重即可,可直接复用方案1的查询参数配置,查询性能会优于原生短语匹配。
原查询异常原因
你之前的配置只对整个用户输入的完整短语做了加权,当用户输入3个及以上词时,只有完整匹配所有输入词的内容才能拿到短语权重,中间的连续2词组合没有对应的加权规则,因此无法得到预期排序。
内容的提问来源于stack exchange,提问作者Thamizh
相关产品推荐
相关产品推荐

