搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)
csdh11 2024-11-30 14:14 27 浏览
1 简介
1.1 背景
《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性,搜索schema,agg,表达式搜索映射,本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划
1.2 关键词
? 文档 Document
elasticsearch 一行数据称为文档,需要注意与文件/文档区分,有冲突的地方用“ES文档”区分
? 索引schema
相当于关系数据库的schema,xml格式,定义索引的字段,类型,还有搜索策略,分词等搜索相关属性
? 搜索/过滤
elasticsearch查询分两部分,搜索和过滤,搜索计算文档与搜索词相似(匹配)度,得出分数排序,分数越高相似度越高,排序也靠前;过滤相当于sql的where,结果是true或者false
? 查询对象装配映射
elasticsearch es dsl 查询功能非常丰富,可调参数多, 提供精准细致的搜索调整,但也很难用,更难复用,onesearch设计装配映射组件支持通用表达式转换esdsl,用户只需编写通用表达式,如,((f1=‘a’or f2=’b’) and f3=‘c’)) 即可实现搜索过滤,类似elasticsearch自身也提供了sql查询功能,大大降低开发难度,同时具备高复用性
1.3 参考资料
再见esdsl, elasticsearch扩展使用通用表达式搜索
分布式datax架构设计 分布式文档索引全量增量使用分布式datax
2 规划特性与发布计划
2.1 M1 大规模/分布式文件索引
? 文档抓取
1) 文档内容抓取组件,metadata(base+extras)+content
2) 抓取组件隔离机制
? 索引引擎,基于分布式dataX,支持批量/增量
2.2 M2 精确搜索/多元搜索
? 装配/映射 增加支持query,目前已支持映射为filter
1) full text查询映射策略
match
query_string
2) 高亮
3) 返回字段,source/store
4) 批量操作
? springboot starter
3 搜索特性
1. 搜索框,用户输入搜索词
2. 高级搜索,构建搜索过滤表达式,如,(x==’a’ and (y=’abc*’ or z > 100))
3. 统计区,聚合搜索功能,针对搜索内容统计,如文档的类型计数,一般展示不超过3项,多于3行点击”》”查看
4. 标题/内容,标准搜索返回展示,带高亮
5. 文档extras属性(TBD),文档的专有属性,如,视频的播放时间
4 onesearch总体架构
? schema模块,定义索引字段,索引策略,搜索策略等,管理索引及其搜索特性
? 聚合搜索(agg)模块,基于schema模块,支持xml定义agg,零编码增加agg主题
? 查询模块,负责构建通用表达式(如,((f1=‘a’or f2=’b’) and f3=‘c’)),作为搜索输入条件代替esdsl
? 映射引擎,映射通用表达式为最优的es dsl,支持=,!=,like,in,range,prefix,not/and/or,大小括号,点(.)等操作符映射,解决es dsl难使用,难复用的痛点
? 抽象搜索引擎接口,无缝接入不同的搜索引擎,如,elasticsearch,opensearch,solrcloud等,更可同时使用多种引擎
? 同步,全量同步/增量同步,接入分布式dataX
5 组件架构
下图是onesearch 2.0组件的架构视图
抓取器 文档库分片/内容抓取,引入tika
索引组件 接入分布式dataX,实现为dataX的reader/writer,实现高吞吐,分布式的文档索引;依赖setl读取文件目录(数据库表);依赖搜索引起索引服务
搜索引擎 支持批量操作的索引服务,自定义索引策略,索引模式
6 全文搜索-esdsl装配映射组件
2.0 对装配映射组件重构,支持完整的映射,增加了query,返回字段支持;1.0 支持 filter,高亮,分页,排序
? 装配/映射抽象模型
装配映射组件设计原理:
搜索请求由多个模块有机组合而成,如,sql,选择字段(select), from, where3块组成
SearchAssemble 装配器,调用SearchBlockMapping生成模块,组装成可执行搜索请求,模板变量T是可执行请求类型
SearchBlockMapping 模块的映射器,接受SerchConfigBean,映射为搜索请求的模块,模板变量T是映射生成结果类型,P接受配置类型,
OperatorMapping 表达式映射器
? elasticsearch实现
基于模板的装配/映射实现
elasticsearch的esdsl有由以下块(Block)构成:
查询映射块,接收QueryPropertis配置,QueryPropertis有两个映射策略,Match和Query String,
查询映射块调用filter映射块,构建filter部分,filter映射块调用表达式映射块转换filter表达式为esdsl,组成filter块,再嵌入到查询块构建完整的查询映射块;查询映射块模板变量T是字符串(json)类型,P类型是QueryPropertis
选择字段块,目前实现source过滤方式,接受SourceFieldsProperties配置,store方式暂没实现
Agg映射块 映射后端agg schema配置为AggregationBuilder,即模板变量T是AggregationBuilder
高亮映射块 模板变量T是HighlightBuilder,即映射生成HighlightBuilder
其他,排序块,分页块比较简单没有实现为块映射
TemplateESSearchAssemble 装配实现,T是SearchSourceBuilder, 即装配返回SearchSourceBuilder
? 默认即可用
装配映射配置复杂,用户使用比较麻烦,涉及细致的调参,本着默认即可用的理念,组件提供默认的配置
1. 选择字段块,source字段方式,排除_content字段(如果有)
2. query, match查询,text字段匹配搜索词,其他字段用于filter表达式
3. 高亮,text字段设置高亮,高亮优先,_content字段排除在返回中,只有高亮,但高亮默认设置noMathcSize属性
7 索引组件
reader/transformer/writer datax作业组件组合,reader读取文档内容,属性+内容的形式;writer依赖搜索引擎
本版本文档目录从数据库读取,setl-data提供统一的dao接口,无缝切换不同的驱动;marker支持轮询增量的组件;数据库支持事务log,可使用setl-data的cdc组件
file-storage 文档(流)载入组件,支持多库多协议
document-extractor 文件解释内容抓取,核心使用tika
7.1 文件存取组件(file-storage)
文档索引首先需要载入文档,文档载入两个关键,文档地址和读写协议
file-storage提供统一FileService接口,桥接地址和协议,提供多库多协议读取能力;
组件根据url,如,schema://rootUrl/, 选择对应FileService
组件目前支持本地磁盘,smb,ali oss,ftp,minio
7.2 抓取器组件(extractor)
组件使用tika解释和抓取文档内容
IndexingDocument 索引资源bean,属性+内容,索引文档Id对于后期增量同步很重要,提供两种id生成,url和文档id,其中文档id为了支持多库,增加文档库编号sn字段,组成”sn-id“作为索引id
? 内容处理器
tika很好的解释文档,抓取文档内容,但留下一个问题,BodyContentHandler实现是基于内存的,需要用户设置write-limit限制内存使用,OOM问题交给用户了。
文档索引,大文件会产生大容量内容,同时datax reader/transformer/writer链路长,内存使用时间长,write-limit设置显得困难,内容容量大,内存使用高,容易出现oom,只能降低并发度,因此需要实现基于磁盘的内容处理器
BodyContentHandler依赖Writer写入内容,基于文件内容处理器核心是实现FileBasedWriter,使用临时文件,reader实例化,载入文档,datax writer写入es,然后释放流和删除临时文件
写入阶段仍然需要流生成内存字节,但缩短内存使用时间
7.3 转换组件(transformer)
转换的设计参考 datax基于规则转换(RBT)组件+图数据库间同步设计与实现
StreamRecord,支持大容量文本以文件流形式传递
SyncStreamRecord 携带Marker,参考增量索引
7.4 全量文档索引
7.4.1 文档分片遍历
接入分布式dataX,需要分片的策略,无重复无遗漏的遍历所有的文档
a) 数据库分片
数据表的分片
b) 目录分支分片
节点分配一个分支(路径),该策略简单,但容易出现分配倾斜
c) 文件名哈希
所有节点遍历整个文档目录,只处理分派给自身的hash分片,该策略分配比较均衡,需要完整统一的文件名hash实现,能处理不同语言,特殊字符的hash计算
7.4.2 Reader
Reader 分段,分页,抓取器->StreamRecord
7.4.3 Writer
Writer Record->IndexingDocument->索引服务->写入elasticsearch
Writer依赖onesearch组件,onesearch提供的索引服务,因此writer实现非常简单
索引使用StreamRecord传递数据,根据onesearch getter机制获取索引属性,实现StreamRecordValueGetter
关于onesearch getter组件参考《搜索引擎onesearch 1.0-设计与实现.docx》
7.4.4 技术架构
批量分布式索引技术架构
client 负责写入任务组分片;触发 worker 执行;client 可集成到管理台;作业监管,检测作业完成,清理作业环境
watcher 作业统计,输出统计;按作业分片观测和聚合计算; watcher 可集成到管理台
worker 分配分片;任务(组)执行,任务组执行统计
8 增量索引
8.1 标记组件
标记(marker/xmarker)组件用于资源切分, 如,数据表/文件,
marker使用表里的单调递增字段,每次批处理升序排序的数据,处理完记录最后一个,即最大value,下次获取数据>value获取未处理数据,这种方式会重复处理数据,应用需要识别或支持幂等
xmarker增加hash值,支持横向切分
8.2 增量分片
全量是有上下边界的大表,分页即分片,而增量是有下届没有上界的表,也可以使用与全量一样的分片,最上面的分片无上界,这里引入另一种方式,hash分片,worker分配取模数,worker获取文件数据,使用设定的字段取模,只处理等于分配的hash的记录,组件使用updateTime取模,这种适用于增量,分片不用改变,而增量的分片一次性,每次运行前重新计算分片上下界
8.3 增量reader/writer
Reader 读取文档记录,构建SyncStreamRecord,携带XMarker
Writer 与全量同一个writer,判断record类型,取出XMarker,更新marker
8.4 技术架构
分布式架构使用分布式datax,与全量基本一致架构,上图用另一种表达方式,与全量不同,增量client是定时任务,全量是一次性执行
9 spring boot starter
spring boot starter自动配置组件
ESClientBeanConfig elasticsearch rest client 构建和初始化,索引和搜索均使用到
SchemaBeanConfig 索引schema, 序列化器,索引和搜索均使用到
ESIndexServiceBeanConfig 引擎层索引服务/文档服务
DocumentServiceBeanConfig 服务层文档服务,getter库
ESSearchMappingBeanConfig elasticsearch 搜索装配映射bean,包括装配器,高亮块映射,查询块映射,operator库等
ESSearchServiceBeanConfig 引擎层搜索服务
SearchServiceBeanConfig 服务层搜索服务
10接口
10.1 datax作业管理api
写入/重置/删除 分布式datax作业,client/worker/watcher
10.2 通用作业管理api
11工程
? 索引组件
indexing-document 文档索引,规划增加数据库索引组件
indexing-document-common 公共常量定义,公共组件
indexing-document-datax 单机datax工程
indexing-document-extractor 抓取器,解释文档,抓取文档属性和内容
indexing-document-reader 全量reader
indexing-document-syncreader 增量reader
indexing-document-reader 转换
indexing-document-reader writer,支持全量和增量
? onessearch
12 zookeeper结构
warcher 域内唯一,处理域内所有作业的统计,使用时间槽方式定时调度
worker 全量/增量工作节点,分片是taskgroup
client 域内唯一,只有增量client定时执行,全量不需要
NEXT
- 搜索权限,搜到即能看
- suggester,搜你想搜
相关推荐
- 探索Java项目中日志系统最佳实践:从入门到精通
-
探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...
- 用了这么多年的java日志框架,你真的弄懂了吗?
-
在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...
- 物理老师教你学Java语言(中篇)(物理专业学编程)
-
第四章物质的基本结构——类与对象...
- 一文搞定!Spring Boot3 定时任务操作全攻略
-
各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...
- 你还不懂java的日志系统吗 ?(java的日志类)
-
一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...
- 谈谈枚举的新用法--java(java枚举的作用与好处)
-
问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...
- 你还不懂java的日志系统吗(javaw 日志)
-
一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...
- Java 8之后的那些新特性(三):Java System Logger
-
去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...
- Java开发中的日志管理:让程序“开口说话”
-
Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...
- OS X 效率启动器 Alfred 详解与使用技巧
-
问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...
- Java中 高级的异常处理(java中异常处理的两种方式)
-
介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...
- 【性能调优】全方位教你定位慢SQL,方法介绍下!
-
1.使用数据库自带工具...
- 全面了解mysql锁机制(InnoDB)与问题排查
-
MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...
- 看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法
-
一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 反恐24小时电话铃声 (33)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)