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 ...
随机推荐
- 淀粉质模板 Tree
Tree 题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式: N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 ...
- 《R语言实战》读书笔记--学习张丹日志
从张丹的日志(http://blog.fens.me/rhadoop-r-basic/)中第九条对象看到R对象的几个总结: 1.内在属性 mode length 所有对象都有的属性 2.外部属性 at ...
- if else以及大于、小于、等于逻辑表达式
大多数情况下,可以使用测试命令来对条件进行测试.比如可以比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试.注意这里的空格很重要.要确保方括号的空格. if . ...
- 浅谈_IDEA导入Eclipse的Web项目
相信很多同学在工作中都会遇到将一个Eclipse的Web项目导入IDEA的情景,这里浅谈一下具体的操作流程 一:Import Project,选择要导入的项目 二:选择以Eclipse模型的方式导入 ...
- #!/bin/sh简介
第一次学shell编程,看的文章中说shell程序必须以"#!/bin/sh"开始,也就认为是这样了,虽然知道在shell中以"#"开始的语句都是注释,但也从没 ...
- ListView控件的不为人知的秘密
使用ListView控件展示数据 1.图像列表控件(ImageList控件) 图像列表控件(ImageList控件)是含有图像对象的集合,可以通过索引或关键字引用该集合的每个对象,ImageList控 ...
- js实景题
测天然气流量的仪器每5分钟向数据库插入一条数据,[{time:18:05,value:222},{time:18:10,value:333},{time:18:15,value:444}....... ...
- linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】
转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July ...
- windows安装scrapy
1.安装Twisted 直接pip install Twisted 然后报错 error: Microsoft Visual C++ 14.0 is required. Get it with &qu ...
- 正则表达式之Regex.Matches()用法
//提取字符串中至少连续7位的数字 string txt = "www17736123780eeeee 7377091 ddddsssss7777777"; //找到的成功匹配的集 ...