ES翻译之Function Score Query
Function Score Query
function_score允许你修改通过查询获取文档的分数,很有用处,score function是计算昂贵的,以及在过滤一系列文档上计算分数是高效的
想要使用function_score,使用者必须要定义一个查询和一个或者多个方法,方法是用来为每个文档通过查询计算分数。
function_score 可以通过仅仅一个方法如下:
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"function_score": {
"query": { "match_all": {} },
"boost": "",
"random_score": {},
"boost_mode":"multiply"
}
}
}
'
此外,多种方法可以进行组合使用,既然这样其中一个可以随意选择执行方法只要一个文档匹配给定字段的查询
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"function_score": {
"query": { "match_all": {} },
"boost": "",
"functions": [
{
"filter": { "match": { "test": "bar" } },
"random_score": {},
"weight":
},
{
"filter": { "match": { "test": "cat" } },
"weight":
}
],
"max_boost": ,
"score_mode": "max",
"boost_mode": "multiply",
"min_score" :
}
}
}
'
注意:过滤查询产生的分数不影响
如果没有过滤方法,这就相当于指定"match_all": {}
首先,每个文档通过定义的方法进行打分,参数"score_mode"指定了计算的分数是怎么组成的
- multiply 分数相乘(默认)
- sum 分数相加
- avg 分数平均
- first 第一个方法匹配过滤被应用
- max 最大的分数
- min 最小的分数
因为分数可以在不同的范围(例如:在0和1对于衰退函数 这里直接使用"field_value_factor")
以及因为有时候不同函数对分数的影响是可取的,不同函数生成的分数可以通过用户自定义的"weight"进行调整。
"weight"可以在"functions"数组中的每个方法进行定义(如下例子),乘以由各自函数计算的分数.
如果没有任何一个函数声明给定权重,"weight" 充当函数的功能简单的返回这个"weight".
假设"score_mode" 设置为"avg",通过加权的平均数组合成单独的分数。例如,
如果两个函数返回分数1和2,它们各自的权重分别是3和4,然后它们的分数将会
由下列的组合(1*3+2*4)/(3+4)而不是(1*3+2*4)/2.
新的分数将会严格限制不能超出指定的限制通过设置"max_boost"参数。默认的"max_boost"是FLT_MAX
新计算生成的分数是通过查询分数组成。参数"boost_mode"定义如下:
- multiply 查询分数*函数分数相乘(默认)
- replace 只使用函数的分数,忽略查询的分数
- sum 查询分数和函数分数相加
- avg 平均
- max 取查询分数和函数分数中大的
- min 取查询分数和函数分数中小的
默认情况下,修改分数并不改变文档的匹配,排除那些达不到指定分数的文档,可以通过设置"min_score"参数来
设置想要分数阈值。
注意:为了"min_score"工作,所有查询返回的文档必须被打分,并被一个又一个的过滤。
"function_score"查询提供了各种评分函数如下:
- script_score
- weight
- random_score
- field_value_factor
- decay_functions:gauss,linear,exp
script_score
"script_score"函数允许您包装另一个查询,并可选地自定义它的得分,使用一个脚本表达式从doc中获得的其他数值字段值。
下面是简单的demo:
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"function_score": {
"query": {
"match": { "message": "elasticsearch" }
},
"script_score" : {
"script" : {
"source": "Math.log(2 + doc['likes'].value)"
}
}
}
}
}
'
除了不同的脚本字段值和表达式之外,"_score"脚本参数还可以用于根据包装查询检索分数。
脚本编译缓存起来用于更快速地执行。如果脚本有需要考虑的参数,最好是重用相同的脚本,
并为其提供参数。
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"function_score": {
"query": {
"match": { "message": "elasticsearch" }
},
"script_score" : {
"script" : {
"params": {
"a": ,
"b": 1.2
},
"source": "params.a / Math.pow(params.b, doc['likes'].value)"
}
}
}
}
}
'
注意:这并不像"custom_score"查询,查询的分数和脚本评分的结果相乘。如果你想禁止它,设置"boost_mode":"replace".
Weight
"weight"分数允许你将分数乘以锁提供的权重。这有时是需要的,因为在特定查询上的boost值被规范化了,而对于这个分数函数
来说,它没有。数字的值是浮点类型。
"weight" : number
Random
"random_score"产生的分数是均匀分布在[0,1]之间。默认的,它使用了内部Luncene doc id来作为随机性的来源,这是分厂有效的,
但不幸的是不能复制,因为文档可能会被合并重新编号。
如果你希望分数是可复制的,那么就有可能提供一个seed和一个field。
最后的分数将根据这个seed计算出来,被考虑的文档的最小值和根据索引名称和碎片id计算的salt,以便具有相同值但存储在不同索引中的文档得到不同的分数.
注意,在相同的碎片中,在field中具有相同值的文档会得到相同的分数,所以通常需要使用一个对所有文档都有唯一值的field.
一个好的默认选择可能是使用"_seq_no"字段,它唯一的缺点是如果文档被更新,那么分数将会改变,因为更新操作也会更新"_seq_no"字段的值。
注意:在不设置field的情况下设置seed是可能的,但是这已经被弃用了,因为这需要在"_id"字段上加载fielddata,它会消耗大量的内存。
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"function_score": {
"random_score": {
"seed": ,
"field": "_seq_no"
}
}
}
}
'
Field Value factor
"field_value_factor"函数允许你从一个文档中使用一个字段来影响分数,和使用"script_score"函数类似,
但是,它避免了脚本的开销。如果在多值字段中使用,则只在计算中使用字段的第一个值。
举个例子,假设您有一个用数字"likes"字段索引的文档,并希望通过这个字段来影响文档的分数,这样做的示例看起来是这样的:
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"function_score": {
"field_value_factor": {
"field": "likes",
"factor": 1.2,
"modifier": "sqrt",
"missing":
}
}
}
}
'
这将转化为以下的得分公式:
sqrt(1.2 * doc['likes'].value)
对于"field_value_factor"函数有许多选项:
field 从文档中提取的字段。
factor 使字段值与字段值相乘的可选因子,默认是1
modifier 应用于字段值得修改器,可以是如下几种:: none, log, log1p, log2p, ln, ln1p, ln2p, square, sqrt, or reciprocal. 默认是 none.
Decay functions
衰减函数为一个文档提供一个函数,该函数根据给定来源的用户的数字字段值的距离而衰减。
未完待续...
ES翻译之Function Score Query的更多相关文章
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...
- 通过Function Score Query优化Elasticsearch搜索结果(综合排序)
在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段. 但是使用sort排序过于绝对,它会直接 ...
- Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)
Query DSL (Domain Specific Language),基于json的查询方式 1.Constant score query,常量分值查询,目的就是返回指定的score,一般都结合f ...
- ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await
ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...
- mongodb use where and custom function to query mongodb存储过程
function name regexObjSubObjKey function code function(proto,value) { var match=false; var reg = new ...
- es第四篇:Query DSL
Query and filter context Match All Query 最简单的search请求,匹配所有文档,文档的_score值都是1,示例: get twitter/_search{ ...
- 从零搭建 ES 搜索服务(六)相关性排序优化
一.前言 上篇介绍了搜索结果高亮的实现方法,本篇主要介绍搜索结果相关性排序优化. 二.相关概念 2.1 排序 默认情况下,返回结果是按照「相关性」进行排序的--最相关的文档排在最前. 2.1.1 相关 ...
- 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询优化技巧。
目录 一.导读 二.福利:账号借用 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! ...
- 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践
1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...
随机推荐
- 让JS帮你决定午餐吃什么吧
最愁就是每天中午吃什么了,有空就做了个 JavaScript 轮播随机选择.会轮播预先自定义的菜单中,然后点选定的时候确定一款.代码可以查看本页源代码获得,你可以自定义修改菜单数组. 效果演示 准备选 ...
- Spring之WebSocket网页聊天以及服务器推送
Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring ...
- java应用挂死故障排查
现象: java开发的web应用无法访问 排查: 1.从resin/log/watchdog-manager.log的日志里可以看出来,jvm的内存满,无法创建新进程 java.lang.OutOfM ...
- hdu 5157(树状数组+Manacher)
Harry and magic string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- 第二步:开发工具Eclipse安装并汉化
打开下载官网:www.eclipse.org.点击下载(download英文)然后就是安装步骤了,还是一样一直的点击下一步,默认安装到C盘.如下图: 汉化步骤: 1.打开www.eclipse.org ...
- laravel按月/时间区间查询数据
public function payRollList($time) { $member_phone = Session::get(phone'); $engineer = Engineer::get ...
- AC日记——Dining poj 3281
[POJ-3281] 思路: 把牛拆点: s向食物连边,流量1: 饮料向t连边,流量1: 食物向牛1连边,流量1: 牛2向饮料连边,流量1: 最大流: 来,上代码: #include <cstd ...
- react className的2种变量写法
ES6新增的不少语法都是极好用的, 在拼接变量与字符串时,模版字符串``就是典型的用法 以下是2种写法 <div className={"bubble-box" +' '+` ...
- 学习sphinx
在我们php开发中如何使用sphinx技术? 答:对应MySQL数据库中的字段,就是将字段中的中文信息拆分成多个词语,然后对这些词语建立索引.以后查询的时候,先去查询这些索引文件,然后返回这些满足条件 ...
- Bug预防体系
Web常见产品问题及预防 测试人员在每次版本迭代中,会对项目的整体质量有一个把控,对于项目常见的问题,开发经常犯的错误都会有所了解,为了避免或者减少这样的错误或不规范的事情在发生,测试人员可以整理构建 ...