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的更多相关文章

  1. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  2. 通过Function Score Query优化Elasticsearch搜索结果(综合排序)

    在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段. 但是使用sort排序过于绝对,它会直接 ...

  3. Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)

    Query DSL (Domain Specific Language),基于json的查询方式 1.Constant score query,常量分值查询,目的就是返回指定的score,一般都结合f ...

  4. ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await

    ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...

  5. mongodb use where and custom function to query mongodb存储过程

    function name regexObjSubObjKey function code function(proto,value) { var match=false; var reg = new ...

  6. es第四篇:Query DSL

    Query and filter context Match All Query 最简单的search请求,匹配所有文档,文档的_score值都是1,示例: get twitter/_search{  ...

  7. 从零搭建 ES 搜索服务(六)相关性排序优化

    一.前言 上篇介绍了搜索结果高亮的实现方法,本篇主要介绍搜索结果相关性排序优化. 二.相关概念 2.1 排序 默认情况下,返回结果是按照「相关性」进行排序的--最相关的文档排在最前. 2.1.1 相关 ...

  8. 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 二.福利:账号借用 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! ...

  9. 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践

    1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...

随机推荐

  1. 洛谷 P2485 [SDOI2011]计算器 解题报告

    P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...

  2. 解决PKIX path building failed

    起因 上周在生产环境部署时,把安全证书加到k8s-ingress中时发现报该错误 解决 找网上解决方案,因为这种问题相对比较少见,也没百度,直接谷歌,找到解决方案如下:https://stackove ...

  3. iOS-android-windowsphone等移动终端平台开发流程图

    到了公司后,半个月时间就是在熟悉下面这张图里的流程, 项目流程图:     下面是我对这张图的一些理解:        

  4. 一种机制,与js类似

    我们知道,当两个条件进行逻辑与操作的时候,其中任何一个条件为假,则表达式的结果为假.所以,遇到(A 且 B)这种表达式,如果A为假的话,B是不是真假都无所谓了,当遇到一个假条件的时候,程序也就没有必要 ...

  5. C++ 图像处理类库

    GIFLIB是一个 C 语言的 Gif 图像处理库.支持 Gif 图像读写. 如果需要单独处理某类图片格式,以上类库是比较好的选择,如果处理的格式种类比较多,下面的类库是比较好的选择. ImageMa ...

  6. 如何在natTable表格上添加双击事件

    在项目当中,有时候需要双击表格中的某一行触发一个事件或者一次数据请求,这时候,我们就需要在表格中绑定相关事件,思路实际上很简单,添加一个绑定事件就ok了,那么怎么添加呢?简单实现如下: 1.创建绑定双 ...

  7. centos6.x一键15项系统优化(转自努力哥)

    #!/bin/sh ################################################ #Author:nulige # qqinfo: # Date: -- #vers ...

  8. [BZOJ1260][CQOI2007]涂色paint 区间dp

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 1575  Solved: 955 [Submit][S ...

  9. UVA 624 CD【01背包+路径记录】

    You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is o ...

  10. [Python Cookbook] Pandas: 3 Ways to define a DataFrame

    Using Series (Row-Wise) import pandas as pd purchase_1 = pd.Series({'Name': 'Chris', 'Item Purchased ...