Elasticsearch--更好的搜索_加权得分,脚本,同义词
Apache Lucene评分
计算文档的评分属性时,考虑如下因素:
- 文档加权:对文档建立索引时,对文档的加权值
- 字段加权:查询和索引时,对字段的加权
- 协调:基于文档条数的协调因子。对包含更多查询词条的文档,它提供更大的值
- 逆文档频率:基于词条的因子,它告诉评分公式,给定词条出现的频率有多低。逆文档频率越高,词条越罕见
- 长度规范:基于字段的规范化因子,它基于给定字段包含的词条数目。字段越长,该因子给的加权值越小。这基本意味着更短的文档更受分数的青睐
- 词频:基于词条的因子, 描述给定词条在文档中出现的次数,词频越高,文档的得分越高。
- 查询规范:基于查询的规范化因子,由每个查询词条比重的平方和计算而成。查询规范用于查询之间的得分比较。
从上述讨论中得到:
- 匹配的词条越罕见,得分越高
- 文档字段越小,得分越高
- 字段加权越高,得分越高
- 文档匹配的查询词条数目越高,字段越少,分数越高
Elasticsearch的脚本功能
elasticsearch使用脚本执行的任何请求中,一些可能使用到的相似的属性:
- script:包含实际执行的脚本
- lang:脚本的语言信息
- params:包含参数和值,每个定义的参数都可以在脚本中使用,由于缓存,使用参数的脚本比嵌入常数的代码执行更快
脚本执行过程中可以使用的对象
- _doc: 它是org.elasticsearch.search.lookup.DocLookup对象的实例。通过它可以访问当前找到的文档,附带计算的得分和字段的值
- _source:是org.elasticsearch.search.lookup.SourceLookup对象的实例,通过它可以访问当前文档的_source
- _fields:是org.elasticsearch.search.lookup.FieldsLookup对象的实例,通过它可以访问文档的所有字段
另一方面,在文档更新过程中,Elasticsearch只通过_source属性公开了ctx对象,通过它可以访问当前文档。
当访问文档中的字段时,上述三种方式都可以,_doc可以更快的访问到分析的字段,_souce可以更快的访问字段的原始值。
使用自定义的脚本库
小脚本应该定义成文件,放在Elasticsearch的config/scripts目录中。使用方式如下:
{
"query":{
"match_all":{
}
},
"sort":{
"_script":{
"script":"sort_script",
"type":"text",
"order":"asc"
}
}
}
script属性值直接调用我们自定义脚本的名字。
如果对脚本语言执行速度不满意,可以编写elasticsearch插件,插件应该放在lib目录下,并且使用Setting API或者在yml配置文件中注册
搜索不同语言的内容
思路:
- 使用语言检测库检测文档使用的语言,或者由用户将语言信息存放在文档的一个字段中
- 定义索引映射时,根据语言字段设置分析器
{
"mappings":{
"indextype":{
"_analyzer":{
"path":"lang"
},
"properties":{
"lang":{
"type":"keywords",
"index":"not_analyzed"
}
}
}
}
}
lang字段的值是Elasticsearch知道的分析器的名字相同的值。
使用加权影响得分
加权
加权适用于下列地方:
- query:给定查询是复杂查询的一部分,且比其他部分更重要
- field:重要字段的加权
{
"query":{
"query_string":{
"fields":[
"from^5",
"to^10",
"subject"
],
"query":"john"
}
}
}
假定一个索引含有from,to,subject三个字段,现在搜索john,以上查询将生成3个小查询,最后组合结果,to字段权重最大,from字段次之。
function_score查询
{
"query":{
"function_score":{
"query":{
},
"filter":{
},
"functions":[
{
"filter":{
},
"FUNCTION":{
}
}
],
"boost_mode":"",
"score_mode":"",
"max_boost":"",
"boost":""
}
}
}
一般来说,function_score查询中可以使用查询、过滤、函数和附加参数。每个函数可以有一个过滤器定义要应用的过滤结果。
function_score背后的逻辑是首先匹配文档基于score_mode参数计算得分,然后,文档的查询得分由函数计算所得分数结合而成,结合基于boost_mode参数。
boost_mode定义如何将函数查询所计算分数与查询分数结合起来。取值如下
- multiply:默认行为,查询得分与函数得分相乘
- replace:查询的得分忽略,只用函数得分
- sum
- avg
- max
- min
score_mode定义函数计算得分如何结合在一起,取值如下:
- multiply:默认
- sum
- avg
- first
- max
- min
function节点中的可用函数如下:
- boost_factor函数:文档得分乘以一个给定值
- script_score函数:使用脚本计算得分,函数返回得分
- random_score:通过指定seed值生成一个伪随机分数,为了模拟随性,每次都应该指定一个新的seed
- decay函数:基于一个单值得数值型字段计算而来
索引加权
查询加权尽管很强大,但是如果在建立文档的时候就知道哪些字段重要,可以在索引时加权,这样效率也更高。
索引加权既可以通过在插入数据的时候实现,也可以在定义映射的时候加权。
同义词
同义词过滤器
过滤器的类型属性(type)设置为synonym,synonyms属性包括同义词如"crime=>criminality";如果同义词是一个文件,并且在config目录下,则可以通过synonym_path设置
同义词规则
- 显式同义词:crime=>criminality
- 等效同义词:war, star wars
- 扩展同义词:a,b => c,d a或b将被扩展到c和d
Elasticsearch--更好的搜索_加权得分,脚本,同义词的更多相关文章
- ElasticSearch 2 (18) - 深入搜索系列之控制相关度
ElasticSearch 2 (18) - 深入搜索系列之控制相关度 摘要 处理结构化数据(比如:时间.数字.字符串.枚举)的数据库只需要检查一个文档(或行,在关系数据库)是否与查询匹配. 布尔是/ ...
- ElasticSearch 2 (15) - 深入搜索系列之多字段搜索
ElasticSearch 2 (15) - 深入搜索系列之多字段搜索 摘要 查询很少是简单的一句话匹配(one-clause match)查询.很多时候,我们需要用相同或不同的字符串查询1个或多个字 ...
- 转:在ElasticSearch之下(图解搜索的故事)
ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事) 摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我 ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事)
ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事) 摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我 ...
- ElasticSearch 2 (17) - 深入搜索系列之部分匹配
ElasticSearch 2 (17) - 深入搜索系列之部分匹配 摘要 到目前为止,我们介绍的所有查询都是基于完整术语的,为了匹配,最小的单元为单个术语,我们只能查找反向索引中存在的术语. 但是, ...
- ElasticSearch 2 (16) - 深入搜索系列之近似度匹配
ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...
- ElasticSearch 2 (14) - 深入搜索系列之全文搜索
ElasticSearch 2 (14) - 深入搜索系列之全文搜索 摘要 在看过结构化搜索之后,我们看看怎样在全文字段中查找相关度最高的文档. 全文搜索两个最重要的方面是: 相关(relevance ...
- ElasticSearch 2 (13) - 深入搜索系列之结构化搜索
ElasticSearch 2 (13) - 深入搜索系列之结构化搜索 摘要 结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的.它们都有精确的格式,我们可以对这些数据进行逻 ...
随机推荐
- python比较大小
1.python的比较总是检查复合对象的所有部分,直到可以得出结果为止. 2.会自动遍历嵌套的所有数据结构,有多深走多深,首次发现的差值将决定比较的结果 3.== :操作符测试值的相等性 4.is : ...
- 利用Python爬虫实现百度网盘自动化添加资源
事情的起因是这样的,由于我想找几部经典电影欣赏欣赏,于是便向某老司机寻求资源(我备注了需要正规视频,绝对不是他想的那种资源),然后他丢给了我一个视频资源网站,说是比较有名的视频资源网站.我信以为真,便 ...
- FTP指令说明
安装vsftpd: listen=YES: 是否监听端口 anonymous_enable=NO: 是否启用匿名用户 local_enable=YES: 是否允许本地用户登录 write_enable ...
- git fetch 和 git pull 的差别
Git中从远程的分支获取最新的版本号到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本号到本地,不会自己主动merge git fetch origin master git ...
- python可变參数调用函数问题
一直使用python实现一些想法,近期在使用python的过程中出现这样一个需求,定义了一个函数.第一个是普通參数.第二个是默认參数,后面还有可变參数,在最初学习python的时候,都知道非keywo ...
- 合并小图片利器TexturePacker GUI
合并小图片,能够非常大的节省网络开销.尤其如今的站点非常喜欢使用大量的小图标来做一些友好提示.当然使用图片文字也是一种选择. 只是这里推荐的是TexturePacker GUI ,这个确实是一款利器. ...
- WebForms UnobtrusiveValidationMode 须要“jquery”ScriptResourceMapping。
一.问题产生的背景: 在敲牛腩新闻公布系统的后台登录页面的时候,我们用到了RequiredFieldValidator控件(验证非空控件),该控件的作用是禁止输入规定的内容,RequiredField ...
- java websocket开发的客户端程序
最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...
- [办公应用]如何制作二Y轴图(excel)
有时候我们会遇到一种图表,就是X轴一致,可是Y轴的数据相差很大.如下图中,年龄和收入就不是一个数量级,在图表中显示的时候,“年龄”的曲线根本看不到(表中数据仅供举例): 解决的方法就是使用双Y轴显示, ...
- document.body.className = document.body.className.replace("siteorigin-panels-before-js","");
document.body.className = document.body.className.replace("siteorigin-panels-before-js",&q ...