根据上下文动态地对文档进行评分是很常见的。 例如,如果你需要对某个类别内的更多文档进行评分,经典方案是提升(给低分的文档提分)基于某个值的文档,例如页面排名、点击量或类别。Elasticsearch 提供了两种基于值提高分数的新方法。 一个是 rank feature 字段,另一个是它的扩展,即使用值向量。

根据 rank_feature 或 rank_features 字段的数值提高文档的相关性分数。

rank_feature 查询通常用在 bool 查询的 should 子句中,因此它的相关性分数被添加到 bool 查询的其他分数中。

将 rank_feature 或 rank_features 字段的 positive_score_impact 设置为 false,我们建议参与查询的每个文档都有该字段的值。 否则,如果在 should 子句中使用了 rank_feature 查询,它不会对具有缺失值的文档的分数添加任何内容(分数不变),但会为包含特征的文档添加一些提升(分数提高)。 这与我们想要的相反 — 因为我们认为这些特征是负面的,这是因为当 positive_score_impact  为 false 时,值越大则表示相关性越低;值越小,则表示相关性越高。我们希望将包含它们的文档排名低于缺少它们的文档。

与 function_score 查询或其他更改相关分数的方法不同,rank_feature 查询在 track_total_hits 参数不为真时有效地跳过非竞争性命中。 这可以显着提高查询速度。

Talk is cheap, give me the code!

例子

设置索引

要使用 rank_feature 查询,您的索引必须包含 rank_feature 或 rank_features 字段映射。 要了解如何为 rank_feature 查询设置索引,请尝试以下示例。

使用以下字段映射创建 test 索引:

  • pagerank,一个 rank_feature 字段,用于衡量网站的重要性。这个值越大,则表示该网站越重要,相应的搜索得分要更高。
  • url_length,一个包含网站 URL 长度的 rank_feature 字段。 对于此示例,长 URL 与相关性呈负相关,由 positive_score_impact 值为 false 表示。这个长度越长,则表示相关行越低,得分就越低。
  • topics,rank_features 字段,其中包含主题列表以及每个文档与该主题的连接程度的度量。
PUT /test
{"mappings": {"properties": {"pagerank": {"type": "rank_feature"},"url_length": {"type": "rank_feature","positive_score_impact": false},"topics": {"type": "rank_features"}}}
}

将几个文档索引到 test 索引:

PUT /test/_doc/1?refresh
{"url": "https://en.wikipedia.org/wiki/2016_Summer_Olympics","content": "Rio 2016","pagerank": 50.3,"url_length": 42,"topics": {"sports": 50,"brazil": 30}
}
PUT /test/_doc/2?refresh
{"url": "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix","content": "Formula One motor race held on 13 November 2016","pagerank": 50.3,"url_length": 47,"topics": {"sports": 35,"formula one": 65,"brazil": 20}
}
PUT /test/_doc/3?refresh
{"url": "https://en.wikipedia.org/wiki/Deadpool_(film)","content": "Deadpool is a 2016 American superhero film","pagerank": 50.3,"url_length": 37,"topics": {"movies": 60,"super hero": 65}
}

示例查询

以下查询搜索 2016 年并根据 pagerank、url_length 和 sports 主题提高相关性分数。

GET /test/_search?filter_path=**.hits
{"query": {"bool": {"must": [{"match": {"content": "2016"}}],"should": [{"rank_feature": {"field": "pagerank"}},{"rank_feature": {"field": "url_length","boost": 0.1}},{"rank_feature": {"field": "topics.sports","boost": 0.4}}]}}
}

上面的查询是这样的:

  • 首先搜索 content 字段里是否含有 2016。如果没有改文档就不会被搜索到
  • pagerank 的值越大,则表示相关性越高
  • url_length 的值越大,则表示越不相关,boost 参数为 0.1
  • topics.sports 的值越大则相关性越高,boost 参数为 0.4

上面查询的结果为:

{"hits" : {"hits" : [{"_index" : "test","_id" : "1","_score" : 0.9496303,"_source" : {"url" : "https://en.wikipedia.org/wiki/2016_Summer_Olympics","content" : "Rio 2016","pagerank" : 50.3,"url_length" : 42,"topics" : {"sports" : 50,"brazil" : 30}}},{"_index" : "test","_id" : "2","_score" : 0.838465,"_source" : {"url" : "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix","content" : "Formula One motor race held on 13 November 2016","pagerank" : 50.3,"url_length" : 47,"topics" : {"sports" : 35,"formula one" : 65,"brazil" : 20}}},{"_index" : "test","_id" : "3","_score" : 0.6779422,"_source" : {"url" : "https://en.wikipedia.org/wiki/Deadpool_(film)","content" : "Deadpool is a 2016 American superhero film","pagerank" : 50.3,"url_length" : 37,"topics" : {"movies" : 60,"super hero" : 65}}}]}
}

在有些场景里,比如抖音搜索里,就可以用到。如果一个用户的画像比较明确,比如该用户喜欢 sports 或 music,那么匹配那些含有这些标签的主播。

我们也可以做如下的查询:

GET test/_search?filter_path=**.hits
{"query": {"rank_feature": {"field": "pagerank"}}
}

上面返回的结果为:

{"hits" : {"hits" : [{"_index" : "test","_id" : "1","_score" : 0.5,"_source" : {"url" : "https://en.wikipedia.org/wiki/2016_Summer_Olympics","content" : "Rio 2016","pagerank" : 50.3,"url_length" : 42,"topics" : {"sports" : 50,"brazil" : 30}}},{"_index" : "test","_id" : "2","_score" : 0.5,"_source" : {"url" : "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix","content" : "Formula One motor race held on 13 November 2016","pagerank" : 50.3,"url_length" : 47,"topics" : {"sports" : 35,"formula one" : 65,"brazil" : 20}}},{"_index" : "test","_id" : "3","_score" : 0.5,"_source" : {"url" : "https://en.wikipedia.org/wiki/Deadpool_(film)","content" : "Deadpool is a 2016 American superhero film","pagerank" : 50.3,"url_length" : 37,"topics" : {"movies" : 60,"super hero" : 65}}}]}
}

我们还可以做如下的查询:

GET test/_search?filter_path=**.hits
{"query": {"rank_feature": {"field": "topics.sports"}}
}

上面返回的结果为:

{"hits" : {"hits" : [{"_index" : "test","_id" : "1","_score" : 0.5405406,"_source" : {"url" : "https://en.wikipedia.org/wiki/2016_Summer_Olympics","content" : "Rio 2016","pagerank" : 50.3,"url_length" : 42,"topics" : {"sports" : 50,"brazil" : 30}}},{"_index" : "test","_id" : "2","_score" : 0.4516129,"_source" : {"url" : "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix","content" : "Formula One motor race held on 13 November 2016","pagerank" : 50.3,"url_length" : 47,"topics" : {"sports" : 35,"formula one" : 65,"brazil" : 20}}}]}
}

rank_feature 和 rank_features 是用于存储值的特殊类型字段,主要用于对结果进行评分。rank_feature 和 rank_features 中的值只能是单个正值(不允许有多个值)。 在 rank_features 的情况下,值必须是一个 hash 值,由一个字符串和一个正数值组成。
有一个标志可以改变评分的行为 — positive_score_impact。 该值默认为 true,但如果你希望该特征的值降低分数,你可以将其设置为 false。 在 pagerank 示例中,url 的长度会降低文档的分数,因为 url 越长,它的相关性就越低。

参考:

【1】 Rank feature query | Elasticsearch Guide [8.2] | Elastic

Elasticsearch:Rank feature query - 排名功能查询相关推荐

  1. 再试译ScottGu's Posts 之 VS2008之语言特性--查询语法--New Orcas Language Feature: Query Syntax...

    学习一门新的语言,总要从其语法学起.为了方便大家学习,同时也为了自己学习,就将ScottGu的这篇关于3.5中增加的新的特性帖子译了出来.这次我翻译采用中汉对照的方式,不然像上次译的那个那样的话不但我 ...

  2. ElasticSearch高级 (Query DSL查询 bulk批量操作 导入数据 各种查询 实战技巧-优化比重 全量与增量数据同步)

    ElasticSearch高级 01-Query DSL(Domain Specific Language) 1 查询上下文 2 相关度评分:_score 3 元数据:_source 4 Query ...

  3. Oracle 11g dataguard三种模式以及实时查询(Real-time query)功能设置

    之前我们讨论过<Linux Oracle 11g dataguard物理standby 配置过程>, 但是在实际过程中会遇到不同的问题,首先我们讨论下ORACLE DATAGUARD的三种 ...

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

    运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+,ElasticSearch 2.3.2 本文提纲 一.ES 的使用场景 二.运行 springboot-el ...

  5. mysql怎么做排名并列_MySQL实现排名并查询指定用户排名功能,并列排名功能

    MySQL实现排名并查询指定用户排名功能,并列排名功能 表结构: CREATE TABLE test.testsort ( id int(11) NOT NULL AUTO_INCREMENT, ui ...

  6. mysql并列查询_MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码...

    前言 本文主要介绍了关于mysql实现排名及查询指定用户排名功能(并列排名功能)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 表结构: create table test ...

  7. mysql作排名,MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码...

    前言 本文主要介绍了关于MYSQL实现排名及查询指定用户排名功能(并列排名功能)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 表结构: CREATE TABLE test ...

  8. Elasticsearch:理解 query_string 和 simple_query_string 查询

    针对很多的开发者来说,如果你不是很熟悉 DSL 查询,那么在有些情况下,query_string 及 simple_query_string 变得非常灵活及方便.在今天的文章中,我来比较一下这两种查询 ...

  9. Elasticsearch filter和query的不同

    1.query和filter的本质区别? 以下几张图能更好的概括:  query关注点:此文档与此查询子句的匹配程度如何? filter关注点:此文档和查询子句匹配吗? 2.Query检索细化关注点 ...

最新文章

  1. das服务器未响应是怎么回事,google-chrome - WSO2 Data Analytics Server-Analytics仪表板视图功能未响应任何浏览器 - 堆栈内存溢出...
  2. python可以写接口吗_用python写api接口吗
  3. outdated: 17.2D Texture Font
  4. java字符串转日期_JAVA字符串转日期或日期转字符串
  5. [arm 驱动]Linux输入子系统分析
  6. ABP vNext 审计日志获取真实客户端IP
  7. spring学习(49):javaconfig里面定义bean的作用域
  8. 48session的生命周期
  9. ui自动化测试框架_浅谈前端(UI)自动化测试
  10. 计算日期时间间隔,可计算情侣计算在一起的。精确到,天,时,分,秒(输入的日期距离现在有:819天19670小时1180221分钟70813262秒)
  11. 作者:周园春(1975-),男,博士,中国科学院计算机网络信息中心研究员、博士生导师。...
  12. java输出set中的元素_老师,为什么遍历Set集合里的元素,一直都是有序的输出呢?...
  13. TCP流量控制和滑动窗口
  14. SQLite内部机制和新特性
  15. qtqpixmap不出现图片_亚马逊对产品图片有哪些基本要求
  16. sylixos pci
  17. 计算机组成原理第五版(白中英)第七章外存与I/O设备 习题
  18. DbgView 显示OutputDebugString 输出内容 不能显示问题总结
  19. elementui分页插件使用总结
  20. 间接访问百度浏览器c语言程序,百度浏览器支持“.网址”域名访问 让中文上网更便捷...

热门文章

  1. 直播软件开发Android直播悬浮窗实现
  2. 信息学奥赛一本通 1081:分苹果 | OpenJudge NOI 小学奥数 7826:分苹果
  3. 【附源码】计算机毕业设计SSM天气预报查询管理系统
  4. 论文研读 —— 7. Very Deep Convolutional Networks for Large-Scale Image Recognition (1/3)
  5. [AV1] AV1 Specification
  6. c#语言中怎么实现延时功能,timer-在C#中创建“一次运行”延时功能的最佳方法...
  7. 百度API实现地图标点并测距
  8. 仿个人税务 app html5_观天下| 注意!你下载的可能是假“个税APP”
  9. 正大国际期货:你身边有朋友或者亲人做期货挣钱的没有?
  10. ORACLE EBS