文章目录

  • 概述
  • 官方说明
  • 例子

概述

继续跟中华石杉老师学习ES,第26篇

课程地址: https://www.roncoo.com/view/55


官方说明

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

简单来说: 自定义一个function_score函数,自己将某个field的值,跟es内置算出来的分数进行运算,然后由自己指定的field来进行分数的增强


例子

需求: 看帖子的人越多,那么帖子的分数就越高

先给所有的帖子数据增加follower数量 , 将对帖子搜索得到的分数,跟follower_num进行运算,由follower_num在一定程度上增强帖子的分数
看帖子的人越多,那么帖子的分数就越高

POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"follower_num" : 5} }
{ "update": { "_id": "2"} }
{ "doc" : {"follower_num" : 10} }
{ "update": { "_id": "3"} }
{ "doc" : {"follower_num" : 25} }
{ "update": { "_id": "4"} }
{ "doc" : {"follower_num" : 3} }
{ "update": { "_id": "5"} }
{ "doc" : {"follower_num" : 60} }

DSL

GET /forum/article/_search
{"query": {"function_score": {"query": {"multi_match": {"query": "java spark","fields": ["tile", "content"]}},"field_value_factor": {"field": "follower_num","modifier": "log1p","factor": 0.5},"boost_mode": "sum","max_boost": 5}}
}
  • 如果只有field,那么会将每个doc的分数都乘以follower_num,如果有的doc follower是0,那么分数就会变为0,效果很不好。

  • 因此一般会加个log1p函数,公式会变为,new_score = old_score * log(1 + number_of_votes),这样出来的分数会比较合理 。

  • 再加个factor,可以进一步影响分数,new_score = old_score * log(1 + factor * number_of_votes)

  • boost_mode,可以决定分数与指定字段的值如何计算 : multiply,replace, sum,min,max,avg

  • max_boost,限制计算出来的分数不要超过max_boost指定的值

返回结果:

{"took": 87,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": 2,"max_score": 3.8050528,"hits": [{"_index": "forum","_type": "article","_id": "5","_score": 3.8050528,"_source": {"articleID": "DHJK-B-1395-#Ky5","userID": 3,"hidden": false,"postDate": "2019-05-01","tag": ["elasticsearch"],"tag_cnt": 1,"view_cnt": 10,"title": "this is spark blog","content": "spark is best big data solution based on scala ,an programming language similar to java spark","sub_title": "haha, hello world","author_first_name": "Tonny","author_last_name": "Peter Smith","new_author_last_name": "Peter Smith","new_author_first_name": "Tonny","follower_num": 60}},{"_index": "forum","_type": "article","_id": "2","_score": 1.7247463,"_source": {"articleID": "KDKE-B-9947-#kL5","userID": 1,"hidden": false,"postDate": "2017-01-02","tag": ["java"],"tag_cnt": 1,"view_cnt": 50,"title": "this is java blog","content": "i think java is the best programming language","sub_title": "learned a lot of course","author_first_name": "Smith","author_last_name": "Williams","new_author_last_name": "Williams","new_author_first_name": "Smith","follower_num": 10}}]}
}

白话Elasticsearch26-深度探秘搜索技术之function_score自定义相关度分数算法相关推荐

  1. 白话Elasticsearch27-深度探秘搜索技术之误拼写时的fuzzy模糊搜索技术

    文章目录 概述 官方指导 例子 推荐写法 概述 继续跟中华石杉老师学习ES,第27篇 课程地址: https://www.roncoo.com/view/55 官方指导 https://www.ela ...

  2. Elasticsearch深度探秘搜索技术如何手动控制全文检索结果的精准度

    为帖子数据增加标题字段 #插入数据 POST /post/_doc/_bulk { "update": { "_id": "1"} } { ...

  3. 22_深度探秘搜索技术_手动控制全文检索(match)结果的精准度、基于boost的细粒度搜索条件实现权重控制...

    本文章收录于[Elasticsearch 系列],将详细的讲解 Elasticsearch 整个大体系,包括但不限于ELK讲解.ES调优.海量数据处理等 本博客以例子为主线,来说明在elasticse ...

  4. 白话Elasticsearch16-深度探秘搜索技术之使用原生cross-fiedls技术解决搜索弊端

    文章目录 概述 例子 概述 继续跟中华石杉老师学习ES,第15篇 课程地址: https://www.roncoo.com/view/55 白话Elasticsearch14-基于multi_matc ...

  5. 白话Elasticsearch20-深度探秘搜索技术之使用rescoring机制优化近似匹配搜索的性能

    文章目录 概述 官网 match和phrase match(proximity match)区别 优化proximity match的性能 概述 继续跟中华石杉老师学习ES,第19篇 课程地址: ht ...

  6. 白话Elasticsearch18-深度探秘搜索技术之基于slop参数实现近似匹配以及原理剖析

    文章目录 概述 官网 slop 含义 例子 示例一 示例二 示例三 概述 继续跟中华石杉老师学习ES,第18篇 课程地址: https://www.roncoo.com/view/55 接上篇博客 白 ...

  7. 白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索

    文章目录 概述 官网 示例 构造模拟数据 普通查询 使用 multi_match + most fileds查询 best fields VS most fields 概述 继续跟中华石杉老师学习ES ...

  8. 白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐

    文章目录 概述 官网 什么是ngram 什么是edge ngram ngram和index-time搜索推荐原理 例子 概述 继续跟中华石杉老师学习ES,第23篇 课程地址: https://www. ...

  9. 白话Elasticsearch17-深度探秘搜索技术之match_phrase query 短语匹配搜索

    文章目录 概述 官网 近似匹配 例子 match query match phrase query term position match_phrase的基本原理 概述 继续跟中华石杉老师学习ES,第 ...

最新文章

  1. STL笔记(5)条款49:学习破解有关STL的编译器诊断信息
  2. linux虚拟机漏洞修复,linux幽灵漏洞检测和修复方法
  3. pycharm shadows name 'xxxx' from outer scope 警告
  4. C#异步编程のParallel(并行)
  5. linux pcie组raid_大概是市面上带金属 PCIE 装甲和背板中最便宜的一款主板。华擎 Z390 Phantom Gaming X 开箱评测...
  6. 04 grep正则表达式与shellscipt脚本编程
  7. c语言编写面向对象的类
  8. 编程软件有哪些比较好用
  9. 打造地图拼接利器(一)前言
  10. qq linux五笔输入法下载软件,qq五笔输入法
  11. 解决应用程序错误,内存不能为“read”或“written”
  12. Android Canvas制作一个可以拖动改变任意形状的四边形效果,并填充颜色
  13. 《暗时间》读后感(一)——确实需要学习一些心理学有关的内容
  14. IEEE latex 模板 部分文字变色 (变蓝,变成浅蓝色)暂时的解决方案
  15. 数据分析入门学习指南,零基础小白都能轻松看懂
  16. 浅谈C++中的多线程(一)
  17. ffmpeg实现变速播放
  18. 数据结构实验报告:图的基本操作及应用
  19. Apache DolphinScheduler 开源之夏学生项目申请开启,6 大课题等你来拿万元奖金!
  20. 视觉SLAM——三角测量

热门文章

  1. android 分段显示百分比,按百分比设置排名-Android DisplayMetrics
  2. 编写程序python输入任意大的自然数、输出各位数字之和_兰理工Python第一次上机作业源码...
  3. pyton中的self具体含义,加self与不加self有什么区别?
  4. 97. Leetcode 剑指 Offer 60. n个骰子的点数 (动态规划-背包问题)
  5. Hierarchical Attention Networks for Document Classification 阅读笔记
  6. GNN笔记: random walk
  7. 万物之始正则表达式全解析三部曲(中篇)-正则表达式运算符优先级及匹配规则
  8. MCMC采样和M-H采样
  9. python和java对比并发_Python并发编程之从性能角度来初探并发编程(一)
  10. matlab 小波变换_matlab小波工具箱实例(二):时频分析和连续小波变换