【大数据开发运维解决方案】通过降低term在文档出现频率的权重案例教你Solr/Elasticsearch如何自定义Similarity


前言

本篇文章通过介绍“有重复词汇的前提下,调整一个文档中,term在文档命中的频率对分数和排名的影响,如何降低词频对得分的影响”案例,来教你Solr/Elasticsearch如何自定义Similarity。


一、抛出问题及解决思路

1、问题现象

比如当前solr有如下数据:

在这里插入图片描述
可以看到,当前Solr中有4条doc,名称字段有些是重复的,如果我这个时候想要查询出口信用保险,并且期望命中这个短的doc能够排名第一显示,此时执行查询:
在这里插入图片描述

2、问题解决思路

当搜索“出口信用保险”的时候,我们想让返回的带“出口信用保险”的doc排名第一,而不是包含“让出口出口信用保险保险”的doc排名第一显示。换句话说就是想让返回的“出口信用保险”这个doc得分最高,根据得分降序排序能排在第一的位置,但是以Solr目前默认的相似性算法
<similarity class="solr.ClassicSimilarityFactory"/>
来看,它认为“出口出口信用保险保险”与“出口信用保险”更相似,score更高,因为“出口出口信用保险保险”在与“出口信用保险”都能完全匹配检索词“出口信用保险”的基础上还重复匹配到了“出口”、“保险”两个词,我们认为匹配这种重复的词本身是无意义的,如果让tf 的作用变大,明显示会使得它的评分更大,但这有时候不是我们想要的,所以我们想让所有命中词的文档的tf 不受频率的影响,使其tf=1.0f,如下自定义的评分器:

import org.apache.lucene.search.similarities.ClassicSimilarity;

public class TzzSolrSimilarity extends ClassicSimilarity
{
    
    
  public float tf(float freq)
  {
    
    
    return 1.0F;
  }

  public float tf(int freq)
  {
    
    
    return 1.0F;
  }
}

使用这种评分,对于一个文档来说,一个term在文档出现的频率并不影响分数,在词频不影响最终得分后,因为“出口信用保险”长度比“出口出口信用保险保险”长度更短,按照solr匹配结果长度越短,越相似的原则,“出口信用保险”这个结果就会排在第一名了,比如下面测试:

在这里插入图片描述
两条数据同时匹配到检索词“中国”,但是由于“中国山东”比“中国内蒙古”更短,得分更高。

3、需求

该如何新增这个自定义Similarity 。

二、新增这个自定义Similarity

整体的操作步骤如下:

1、编写TzzSolrSimilarity类

编写TzzSolrSimilarity类,并打包TzzSolrSimilarity-1.0-SNAPSHOT.jar

2、放置TzzSolrSimilarity-1.0-SNAPSHOT.jar

将TzzSolrSimilarity-1.0-SNAPSHOT.jar拷贝到每个solr所安装的机器的/opt/huawei/Bigdata/FusionInsight_HD_6.5.1.X/install/FusionInsight-Solr-6.2.0/solr-6.2.0/apache-tomcat-8.5.40/webapps/solr/WEB-INF/lib/,并执行

chown omm:wheel /opt/huawei/Bigdata/FusionInsight_HD_6.5.1.X/install/FusionInsight-Solr-6.2.0/solr-6.2.0/apache-tomcat-8.5.40/webapps/solr/WEB-INF/lib/TzzSolrSimilarity-1.0-SNAPSHOT.jar

修改jar包所属用户为omm

3、下载配置

在客户端执行

solrctl confset --get confname /opt/conf/ 

其中confname为目标配置集,将其下载到/opt/conf目录下

4、managed-schema新增配置

在下载的配置集的managed-schema中增加配置,此处class为第1步中的类的全路径

<similarity class="com.huawei.fusioninsight.solr.similarity.TzzSolrSimilarity">
     </similarity>

5、修改solrconfig.xml

在下载的配置集的solrconfig.xml中配置

<lib dir="/opt/huawei/Bigdata/FusionInsight_HD_6.5.1.X/install/FusionInsight-Solr-6.2.0/solr-6.2.0/apache-tomcat-8.5.40/webapps/solr/WEB-INF/lib/" regex="TzzSolrSimilarity*.jar" />

6、 使用solr用户更新配置集

solrctl confset --update confname /opt/conf

其中confname为目标配置集

7、重启solr服务

验证:
修改之前:
在这里插入图片描述
修改之后:

在这里插入图片描述
从上面结果我们能够看到,我期望的“出口信用保险” 这个doc已经排名第一了~
这就是一个完整的自定义Similarity过程。


总结

本篇文章通过介绍“有重复词汇的前提下,调整一个文档中,term在文档命中的频率对分数和排名的影响,如何降低词频对得分的影响”案例,来教你Solr/Elasticsearch如何自定义Similarity。

猜你喜欢

转载自blog.csdn.net/qq_28356739/article/details/129800322
今日推荐