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

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

当搜索“出口信用保险”的时候,我们想让返回的带“出口信用保险”的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匹配结果长度越短,越相似的原则,“出口信用保险”这个结果就会排在第一名了,比如下面测试:

两条数据同时匹配到检索词“中国”,但是由于“中国山东”比“中国内蒙古”更短,得分更高。
该如何新增这个自定义Similarity 。
整体的操作步骤如下:
编写TzzSolrSimilarity类,并打包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
在客户端执行
solrctl confset --get confname /opt/conf/
其中confname为目标配置集,将其下载到/opt/conf目录下
在下载的配置集的managed-schema中增加配置,此处class为第1步中的类的全路径
<similarity class="com.huawei.fusioninsight.solr.similarity.TzzSolrSimilarity">
</similarity>
在下载的配置集的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" />
solrctl confset --update confname /opt/conf
其中confname为目标配置集
验证:
修改之前:

修改之后:

从上面结果我们能够看到,我期望的“出口信用保险” 这个doc已经排名第一了~
这就是一个完整的自定义Similarity过程。
本篇文章通过介绍“有重复词汇的前提下,调整一个文档中,term在文档命中的频率对分数和排名的影响,如何降低词频对得分的影响”案例,来教你Solr/Elasticsearch如何自定义Similarity。
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决