文章目录

  • 1. 背景
  • 2. 数据构建
  • 3. function score使用
    • 3.1 function score示例
    • 3.2 参数说明

1. 背景

实际开发中,使用elasticsearch做搜索时,难免会遇到以下需求:
(假设,搜索"吴京",同时去搜索contentName、actor、director三个字段)
(1)场景1:三个字段中包含"吴京"的文档的排序:contentName>actor>director(即contenName包含吴京的文档在前,actor次之,director最后)
(2)场景2:包含“吴京”的字段多的文档排序靠前,少的靠后

2. 数据构建

POST /_bulk
{"index":{"_index":"my-test2","_id":"1"}}
{"contentName":"战啥狼","actor":["吴啥京","张啥翰"],"director":["吴啥京"]}
{"index":{"_index":"my-test2","_id":"2"}}
{"contentName":"战神啥传奇","actor":["周杰啥伦","吴啥非"],"director":["吴啥京"]}
{"index":{"_index":"my-test2","_id":"3"}}
{"contentName":"狼图啥腾","actor":["吴啥京"],"director":[]}
{"index":{"_index":"my-test2","_id":"4"}}
{"contentName":"烽火啥狼烟","actor":["小啥明","王啥华"],"director":["这是战啥狼"]}
{"index":{"_index":"my-test2","_id":"5"}}
{"contentName":"吴啥京做客什么什么","actor":["吴啥京"],"director":["吴啥京"]}
{"index":{"_index":"my-test2","_id":"6"}}
{"contentName":"吴啥京","actor":["吴啥京"],"director":["吴啥京"]}
{"index":{"_index":"my-test2","_id":"7"}}
{"contentName":"又是一部啥电影","actor":["吴啥京"],"director":["吴啥京"]}
{"index":{"_index":"my-test2","_id":"8"}}
{"contentName":"又是一部啥电影2","actor":["哈哈喽"],"director":["吴啥京"]}
{"index":{"_index":"my-test2","_id":"9"}}
{"contentName":"战神杀杀杀狼无敌啊","actor":["吴啥京"],"director":["这是战啥狼"]}
{"index":{"_index":"my-test2","_id":"10"}}
{"contentName":"不知道起什么名字","actor":["这是战啥狼"],"director":["这也是战啥狼"]}

3. function score使用

  1. 在执行完一个查询后,function score允许我们修改文档的评分
  2. 使用function score,用户需要定义一个查询语句,还有一个或多个function用来计算一个新的评分(对于这个查询返回的每个文档)

3.1 function score示例

GET /_search
{"query": {"function_score": {"query": { "match_all": {} },"boost": "5", "functions": [{"filter": { "match": { "test": "bar" } },"random_score": {}, "weight": 23},{"filter": { "match": { "test": "cat" } },"weight": 42}],"max_boost": 42,"score_mode": "max","boost_mode": "multiply","min_score": 42}}
}

3.2 参数说明

  1. score_mode:指定如何去组合计算评分
     (1) multiply:默认。相乘(2) sum:相加(3) avg:平均值(4) first:应用第一个function(5) max: 应用最大的(6) min:应用最小的
  1. boost_mode:新的计算得分和原来的查询得分的结合方式
     (1) multiply:默认。query score和function score相乘(2) replace:仅使用function score,忽略query score(3) sum:query score和function score相加(3) avg:平均值(4) max: query score和function score中最大的(5) min: query score和function score中最小的

使用multi_match最初始的查询评分排序

GET /my-test2/_search
{"size": 3, "query": {"multi_match": {"query": "吴啥京","fields": ["actor","contentName","director"],"type": "phrase"}}
}
{..."hits" : {"total" : {"value" : 8,"relation" : "eq"},"max_score" : 4.0664473,"hits" : [{"_index" : "my-test2","_type" : "_doc","_id" : "6","_score" : 4.0664473,"_source" : {"contentName" : "吴啥京","actor" : ["吴啥京"],"director" : ["吴啥京"]}},{"_index" : "my-test2","_type" : "_doc","_id" : "5","_score" : 2.6965895,"_source" : {"contentName" : "吴啥京做客什么什么","actor" : ["吴啥京"],"director" : ["吴啥京"]}},{"_index" : "my-test2","_type" : "_doc","_id" : "3","_score" : 1.1954124,"_source" : {"contentName" : "狼图啥腾","actor" : ["吴啥京"],"director" : [ ]}}]}
}

使用function_score(score_mode=sum boost_mode=multiply)

GET /my-test2/_search
{"size": 3, "query": {"function_score": {"query": {"multi_match": {"query": "吴啥京","fields": ["actor","contentName","director"],"type": "phrase"}},"functions": [{"filter": {"match_phrase": {"contentName": "吴啥京"}},"weight": 2},{"filter": {"match_phrase": {"actor": "吴啥京"}},"weight": 3},{"filter": {"match_phrase": {"director": "吴啥京"}},"weight": 4}],"score_mode": "sum","boost_mode": "multiply"}}
}
{..."hits" : {"total" : {"value" : 8,"relation" : "eq"},"max_score" : 36.598026,"hits" : [{"_index" : "my-test2","_type" : "_doc","_id" : "6","_score" : 36.598026,"_source" : {"contentName" : "吴啥京","actor" : ["吴啥京"],"director" : ["吴啥京"]}},{"_index" : "my-test2","_type" : "_doc","_id" : "5","_score" : 24.269306,"_source" : {"contentName" : "吴啥京做客什么什么","actor" : ["吴啥京"],"director" : ["吴啥京"]}},{"_index" : "my-test2","_type" : "_doc","_id" : "7","_score" : 8.367887,"_source" : {"contentName" : "又是一部啥电影","actor" : ["吴啥京"],"director" : ["吴啥京"]}}]}
}

从返回的_score字段可以看出,最新的评分 = 将计算评分相加后,又乘以原始的搜索评分(eg: 36.598026 ≈ (2+3+4)*4.0664473 )

使用function_score(score_mode=multiply boost_mode=multiply)

{..."hits" : {"total" : {"value" : 8,"relation" : "eq"},"max_score" : 97.594734,"hits" : [{"_index" : "my-test2","_type" : "_doc","_id" : "6","_score" : 97.594734,"_source" : {"contentName" : "吴啥京","actor" : ["吴啥京"],"director" : ["吴啥京"]}},{"_index" : "my-test2","_type" : "_doc","_id" : "5","_score" : 64.71815,"_source" : {"contentName" : "吴啥京做客什么什么","actor" : ["吴啥京"],"director" : ["吴啥京"]}},{"_index" : "my-test2","_type" : "_doc","_id" : "7","_score" : 14.344949,"_source" : {"contentName" : "又是一部啥电影","actor" : ["吴啥京"],"director" : ["吴啥京"]}}]}
}

从返回的_score字段可以看出,最新的评分 = 计算评分相乘,又乘以原始的搜索评分(eg: 97.594734 ≈ (234)*4.0664473 )

经测试,score_mode是用来控制functions中的评分关系,是”相乘“还是”相加“等;boost_mode是用来控制functions中的评分关系与原始搜索评分的关系

  1. min_score:默认情况下,评分修改不会改变匹配的文档. 想要排除不满足某个评分阈值的文档,该参数(min_score)可以设置为需要的评分阈值

Elasticsearch中的评分排序--Function score query相关推荐

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

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

  2. Elasticsearch中如何进行排序(中文+父子文档+嵌套文档)

    Elasticsearch中如何进行排序 背景 最近去兄弟部门的新自定义查询项目组搬砖,项目使用Elasticsearch进行数据的检索和查询.每一个查询页面都需要根据选择的字段进行排序,以为是一个比 ...

  3. 【Elasticsearch】Elasticsearch中的相似度评分介绍

    1.概述 转载:Elasticsearch中的相似度评分介绍 本文要点 相关性得分是一个搜索引擎的核心,了解它的工作原理对创建一个好的搜索引擎至关重要. Elasticsearch 使用了两种相似度评 ...

  4. es Score Query优化查询

    通过Function Score Query function_score查询是处理分值计算过程的终极工具.它让你能够对所有匹配了主查询的每份文档调用一个函数来调整甚至是完全替换原来的_score. ...

  5. Elasticsearch中的Multi Match Query

    在Elasticsearch全文检索中,我们用的比较多的就是Multi Match Query,其支持对多个字段进行匹配.Elasticsearch支持5种类型的Multi Match,我们一起来深入 ...

  6. Elasticsearch中的相似度评分机制

    原文链接:https://cloud.tencent.com/developer/news/762466 本文要点: 相关性得分是一个搜索引擎的核心,了解它的工作原理对创建一个好的搜索引擎至关重要. ...

  7. python爬取豆瓣读书_用python+selenium抓取豆瓣读书中最受关注图书并按照评分排序...

    抓取豆瓣读书中的(http://book.douban.com/)最受关注图书,按照评分排序,并保存至txt文件中,需要抓取书籍的名称,作者,评分,体裁和一句话评论 方法一:#coding=utf-8 ...

  8. 用python+selenium抓取豆瓣电影中的正在热映前12部电影并按评分排序

    抓取豆瓣电影(http://movie.douban.com/nowplaying/chengdu/)中的正在热映前12部电影,并按照评分排序,保存至txt文件 1 #coding=utf-8 2 f ...

  9. 6个评委对5选手打分,去掉最高分和最低分,然后求出平均分就是他们的成绩。Sort函数给评分排序,在头文件algorithm中

    //编写一程序统计参赛选手的得分,计分标准为去掉一个最高分和一个最低分后, //对剩余得分求平均值.要求首先从键盘输入评委的个数num,然后输入num个分数(分数为小于等于10的一个正实数), //输 ...

最新文章

  1. 聊天机器人革命即将到来 开发者入局需谨慎
  2. ARM 发布新一代 GPU 架构,还有一个机器学习处理器
  3. CSS基础——position位置属性
  4. 漏洞评估的优先级决定了网络安全保护的成本
  5. winxp批处理重启计算机,WinXP使用关机命令shutdown的方法
  6. 汉字转拼音缩写的函数以及其他函数
  7. 开源组件是什么意思_一文读懂常用开源许可证
  8. React开发(234):windows.onresize
  9. ES系列三、基本知识准备
  10. 什么是网关软件?国内有好的资源网关软件吗?
  11. sql数据库自动备份
  12. python无法定位到table_selenium3 + python - table定位
  13. android监听返回键的方法,详解Html5 监听拦截Android返回键方法
  14. 世界标准时间(UTC) 常识
  15. 路透社:大众与江淮计划在合肥投资50.6亿元建新电动汽车工厂
  16. 卸载rasing,瑞星
  17. 中国金融牌照大全(内附各牌照注册条件)
  18. [附源码]java毕业设计医疗预约系统
  19. Pycharm的python interpreter选择
  20. CKP.CMP工作原理===

热门文章

  1. php怎么快速背,一个月背部快速蜕变?用上这7招效果绝对意想不到!
  2. 中兴pon网络olt升级,更新,原理,实例
  3. 7-14 电话聊天狂人 (25分)
  4. 红宝书读书笔记 第八章
  5. 关于苹果手机点击事件无效的解决办法
  6. 如何保证API不被别人恶意调用(彩蛋)
  7. 是否似曾相识?每个开发人员都犯过的15个错误
  8. 龙梦迷你电脑福珑2.0通过手机USB共享网络联网
  9. 【_ 記 】SpringBoot注解 (最新最全最详细)
  10. robot.txt是干嘛的?