搜索引擎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 大规模/分布式文件索引

Ø 文档抓取

1) 文档内容抓取组件,metadata(base+extras)+content

2) 抓取组件隔离机制

Ø 索引引擎,基于分布式dataX,支持批量/增量

2.2 精确搜索/多元搜索

Ø 装配/映射 增加支持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

  1. 搜索权限,搜到即能看
  2. suggester,搜你想搜
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中间件XL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值