白话Elasticsearch26-深度探秘搜索技术之function_score自定义相关度分数算法
文章目录
- 概述
- 官方说明
- 例子
概述
继续跟中华石杉老师学习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自定义相关度分数算法相关推荐
- 白话Elasticsearch27-深度探秘搜索技术之误拼写时的fuzzy模糊搜索技术
文章目录 概述 官方指导 例子 推荐写法 概述 继续跟中华石杉老师学习ES,第27篇 课程地址: https://www.roncoo.com/view/55 官方指导 https://www.ela ...
- Elasticsearch深度探秘搜索技术如何手动控制全文检索结果的精准度
为帖子数据增加标题字段 #插入数据 POST /post/_doc/_bulk { "update": { "_id": "1"} } { ...
- 22_深度探秘搜索技术_手动控制全文检索(match)结果的精准度、基于boost的细粒度搜索条件实现权重控制...
本文章收录于[Elasticsearch 系列],将详细的讲解 Elasticsearch 整个大体系,包括但不限于ELK讲解.ES调优.海量数据处理等 本博客以例子为主线,来说明在elasticse ...
- 白话Elasticsearch16-深度探秘搜索技术之使用原生cross-fiedls技术解决搜索弊端
文章目录 概述 例子 概述 继续跟中华石杉老师学习ES,第15篇 课程地址: https://www.roncoo.com/view/55 白话Elasticsearch14-基于multi_matc ...
- 白话Elasticsearch20-深度探秘搜索技术之使用rescoring机制优化近似匹配搜索的性能
文章目录 概述 官网 match和phrase match(proximity match)区别 优化proximity match的性能 概述 继续跟中华石杉老师学习ES,第19篇 课程地址: ht ...
- 白话Elasticsearch18-深度探秘搜索技术之基于slop参数实现近似匹配以及原理剖析
文章目录 概述 官网 slop 含义 例子 示例一 示例二 示例三 概述 继续跟中华石杉老师学习ES,第18篇 课程地址: https://www.roncoo.com/view/55 接上篇博客 白 ...
- 白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
文章目录 概述 官网 示例 构造模拟数据 普通查询 使用 multi_match + most fileds查询 best fields VS most fields 概述 继续跟中华石杉老师学习ES ...
- 白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐
文章目录 概述 官网 什么是ngram 什么是edge ngram ngram和index-time搜索推荐原理 例子 概述 继续跟中华石杉老师学习ES,第23篇 课程地址: https://www. ...
- 白话Elasticsearch17-深度探秘搜索技术之match_phrase query 短语匹配搜索
文章目录 概述 官网 近似匹配 例子 match query match phrase query term position match_phrase的基本原理 概述 继续跟中华石杉老师学习ES,第 ...
最新文章
- STL笔记(5)条款49:学习破解有关STL的编译器诊断信息
- linux虚拟机漏洞修复,linux幽灵漏洞检测和修复方法
- pycharm shadows name 'xxxx' from outer scope 警告
- C#异步编程のParallel(并行)
- linux pcie组raid_大概是市面上带金属 PCIE 装甲和背板中最便宜的一款主板。华擎 Z390 Phantom Gaming X 开箱评测...
- 04 grep正则表达式与shellscipt脚本编程
- c语言编写面向对象的类
- 编程软件有哪些比较好用
- 打造地图拼接利器(一)前言
- qq linux五笔输入法下载软件,qq五笔输入法
- 解决应用程序错误,内存不能为“read”或“written”
- Android Canvas制作一个可以拖动改变任意形状的四边形效果,并填充颜色
- 《暗时间》读后感(一)——确实需要学习一些心理学有关的内容
- IEEE latex 模板 部分文字变色 (变蓝,变成浅蓝色)暂时的解决方案
- 数据分析入门学习指南,零基础小白都能轻松看懂
- 浅谈C++中的多线程(一)
- ffmpeg实现变速播放
- 数据结构实验报告:图的基本操作及应用
- Apache DolphinScheduler 开源之夏学生项目申请开启,6 大课题等你来拿万元奖金!
- 视觉SLAM——三角测量
热门文章
- android 分段显示百分比,按百分比设置排名-Android DisplayMetrics
- 编写程序python输入任意大的自然数、输出各位数字之和_兰理工Python第一次上机作业源码...
- pyton中的self具体含义,加self与不加self有什么区别?
- 97. Leetcode 剑指 Offer 60. n个骰子的点数 (动态规划-背包问题)
- Hierarchical Attention Networks for Document Classification 阅读笔记
- GNN笔记: random walk
- 万物之始正则表达式全解析三部曲(中篇)-正则表达式运算符优先级及匹配规则
- MCMC采样和M-H采样
- python和java对比并发_Python并发编程之从性能角度来初探并发编程(一)
- matlab 小波变换_matlab小波工具箱实例(二):时频分析和连续小波变换