ElasticSearch快速入门实战(2)-相关性、多字段搜索优化(copy to)、聚合操作、自定义分词

【48、ElasticSearch搜索技术深入与聚合查询实战】4.12 什么是相关性

相关性的概述:

描述一个文档与查询语句匹配程度的衡量标准.ES有一个评分算法,根据查询条件与索引文档的匹配程度来计算相关性.

评分算法:Okapi BM25(RAGFlow关键词搜索也有这个算法)

4.14.1 Index Boost在索引层面修改相关性

5种策略

|-------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------|
| Index Boost:索引层面,比如一批数据有3个标签,现在想在查询的时候让A,B,C的顺序展示标签. 每个标签独占一个索引 查询也是针对索引别名.这样可以做到优先查询某个索引.让有限的返回结果中以指定的索引为主. 场景: 多标签,冷热数据分离 | |
| boosting: 文档级别,默认是1,设为0到1之间就是降低评分. 构造查询条件的时候指定某个字段的权重. 适用于某些特定场合的查询.比如查询时需要以某某条件为主 场景: 给热门产品更多权重 | |
| megative_boost:降低相关性,对某些返回结果不满意但是又不能使用must_not过滤掉. 仅对查询中定义的negative部分生效. negative的评分在0到1之间. 场景: 商品查询结果中想突出苹果手机,可以这么设置,对于苹果派,苹果汁等需要降低相关性 | |
| Function_score: 自定义评分. 比如结合有些关键业务字段的值来计算得分.如商品的销量和浏览人数.文章的阅读量和点赞收藏人数 场景: ①融合业务指标(销量,浏览量,点赞量)②时间衰减,新闻,博客等内容随时间推移降权,让新内容优先展示; ③地理位置衰减;④人工干预:置顶,精选 | |
| rescore query查询后二次打分. 原先已经有复杂的查询条件了,只是查询结果不太满意想调整得分; 在原来结果的基础上重新对查询结果按字段设置权重. 场景:精排,适用于实现Learning to Rank等高级排序模型. 结合机器学习模型或者复杂脚本最终返回top N条. | |

4.15.1 dis max&best fields最佳字段搜索

多字段搜索场景优化

最佳字段:比如博客的标题和内容字段,都含有查询关键词的话,结果得分是求和的.(多字段查询一般是should查询)

dis_max,只取条件字段中得分最大的字段。如果只用dis_max效果还不好:

这里是在最佳匹配的基础上再加一个调整参数.

这里有2个字段,一个必然是最佳字段,另一个就是其它字段.带入上面计算公式.

语法更简洁.

4.15.3 cross fields 跨字段搜索

这种的查询一般是想要province里出现湖南,city里出现常德.但是这么查询会导致province或者city里只有一个满足条件的也被查出来.不是我们想要的结果.

还可以使用 copy to.(额外增加一些存储空间,但是查询效果很好)

copy to的缺点,增大系统开销,存储和cpu消耗, copy to字段无法精细控制各字段权重.

只能在同一个索引的字段之间操作.

4.17 指标聚合操作详解

|----------------------------------------------------------------------------|-------------------------------------------------------------------|
| | 指标聚合: 最大,最小,count,求和,平均 桶聚合: group by,range,直方图 管道聚合:基于上一次聚合的二次聚合 |

举例子:

先对员工工种进行分组,再对分组后的结果计算平均工资

min_bucket(最小值),percentitles_bucket(百分位),cumulative_sum(累计求和)

4.21 ES聚合分析不精准原因分析

数据量,精确度,实时性 只有2者能同时满足.

ES就是选择了海量数据+实时性,牺牲了精确度.

多分片汇总,单分片获取数据可能会漏

4.22 ES聚合不精准的解决方案

方案3不考虑

4.23 ES聚合性能优化

|---------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
| ①插入数据的时候做预排序(不建议,会影响写入性能) | |
| ②使用filter过滤器,带有缓存功能 | |
| ③统计的时候设置size=0也会缓存结果. | |
| ④拆分聚合,是聚合并行化.借助msearch实现 | |

5.1 SpringBoot整合ElasticSearch

复杂业务用方式3

方式一(repository):(简单场景可以简化开发)

创建实体->定义接口方法

接口中的方法会被自动翻译成下面这样的语句:

方式2(template): 也是封装了一些简单的方法.但是更灵活一点.复杂查询要构建Query对象

方式3(Client): 适合lambda表达式

【50、ElasticSearch深分页详解与自定义分词器实战】6.1深分页会带来什么问题

深分页不推荐使用from+size

①在多分区模式下,深分页查询的数据太多了会导致FullGC;

②使用from...size必须查询结果小于10000条;

方案一:谷歌百度都不做跳页了你还有啥理由要支持深分页;翻那么深才找到想要的数据是不是你搜索做的不通人性?

方案二:使用scroll_search,缺点是只能一页一页往后翻.

方案三:search_after,会创建一个时间点来形成一个视图,保证查询一致性.(像Mysql)

7.1 分词的概述

有些时候IK分词器不适用,需要自定义分词器.

分词发生的阶段是在索引的时候,先分词再构建倒排索引.

检索过程也会使用分词器.

7.2 分词器的组成

字符过滤器(过滤标点符号)->切词器(真正分词)->词项过滤器(比如做大小写转换)

模式上看就是在真正切词操作的前后加上预处理和后处理,类似AOP

3个部分可以单独设置的.

各种字符过滤器:

|----------------------------------------------------------------------------|-------------------------|
| | 这里是设置了a字符过滤,结果是保留文本+a字符 |
| | 这里是设置了屏蔽,很实用的功能. |
| | 还可以按正则规则来替换,很有用. |

各种分词器

词项过滤器:

可以用来做大小写转换,还有停用词(过滤掉and,or之类的)

7.4 Ngram自定义分词实战

需求背景:

还有查手机号,只对匹配到的输入数字进行高亮,而不是整个手机号高亮

最小4,最大11.也就是说会有4个数字的,5个数字的,6个数字的...

相关推荐
JZC_xiaozhong2 小时前
BPM如何打通“请款→审批→付款”全链路?构建企业资金流转闭环
大数据·运维·数据库·数据分析·数据集成与应用集成·业务流程管理·流程监控
福大大架构师每日一题2 小时前
2026年3月TIOBE编程语言排行榜,Go语言排名第16,Rust语言排名14。为什么 TIOBE 指数仍然依赖搜索引擎?
开发语言·搜索引擎·rust·tiobe
升鲜宝供应链及收银系统源代码服务2 小时前
升鲜宝生鲜配送供应链管理系统生产加工子模块的详细表设计说明
java·大数据·前端·数据库·bootstrap·供应链系统·生鲜配送
wanhengidc2 小时前
云手机 数据信息资源共享
大数据·运维·服务器·游戏·智能手机
Oscar的参数3 小时前
datagrip连接未预置数据库保姆级教程--以dm数据库为例
大数据·数据库·database
babe小鑫3 小时前
2026高职大数据技术专业学习数据分析的指南
大数据·学习·数据分析
天远云服3 小时前
PHP微服务风控架构:无缝接入天远劳动仲裁信息查询API排查用工黑产
大数据·微服务·架构·php
zhangkaixuan4563 小时前
Paimon 数据湖 + Gravitino 元数据中心:技术原理与实战指南
大数据·flink·paimon·gravitino·datalake
失败才是人生常态3 小时前
大数据基础学习
大数据·学习