当前位置: 首页 > news >正文

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)

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

分布式 dataX 详细 (落地) 设计

tika原理源码分析

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定时执行,全量不需要

相关文章:

  • 03 APP 自动化-定位元素工具元素定位
  • iOS —— UI 初探
  • docker、ctr、crictl命令简介与使用
  • PostgreSQL优化实践:从查询到架构的性能提升指南
  • DOCKER使用记录
  • 一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (一)
  • 计算机网络 TCP篇常见面试题总结
  • 邂逅Webpack和打包过程
  • 十四、【测试执行篇】让测试跑起来:API 接口测试执行器设计与实现 (后端执行逻辑)
  • 基于springboot的益智游戏系统的设计与实现
  • 安全漏洞修复导致SpringBoot2.7与Springfox不兼容
  • Excel to JSON 插件 2.4.0 版本更新
  • Docker Compose(容器编排)
  • 在Mathematica中可视化Root和Log函数
  • android lifeCycleOwner生命周期
  • vue3中的ref和reactive
  • vim 的基本使用
  • vue+mitt的简便使用
  • Linux 简单模拟实现C语言文件流
  • 剑指offer13_剪绳子
  • 网页制作培训多少钱一天/移动网站如何优化排名
  • 北京集团 网站建设/对百度竞价排名的看法
  • 如何防止网站挂马/宁波正规seo快速排名公司
  • 金色世纪做网站的是哪个岗位/seo网站推广推荐
  • 昆明网站制作前十/小区推广最有效的方式
  • 母婴网站开发/2345浏览器下载