搜索引擎onesearch2.0(基于elasicsearch)文档索引/esdsl装配映射详细设计和实现解释

本文档详细介绍了onesearch2.0的分布式文档索引和esdsl装配映射设计,包括文档、索引schema、搜索过滤以及esdsl装配映射组件。通过esdsl装配映射,简化了Elasticsearch的查询表达式,降低了开发难度。同时,文档涵盖了索引架构、抓取组件、转换组件和搜索引擎组件的架构。此外,还提供了spring boot starter支持和SDK使用指南。
摘要由CSDN通过智能技术生成

1 简介

1.1 背景

《搜索引擎onesearch 2.0 M1设计说明书.docx》介绍了onesearch M1架构设计和高层设计,包括tika源码分析。本文介绍onesearch 2.0 M1分布式文档索引,esdsl装配映射部分的详细设计和实现细节,另外增量索引,额外字段(extras),suggester和搜索权限将后续介绍

1.2 参考资料

《搜索引擎onesearch 1.0-设计与实现.docx》

《搜索引擎onesearch 2.0 M1设计说明书.docx》

《SETL基于规则的转换组件设计说明书.docx》

《分布式dataX架构设计》

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

2 概念

2.1.1 文档 Document

Elasticsearch 一行数据称为文档 Document,需要注意区分文件/文档,有冲突的地方用ES文档区分

2.1.2 索引schema

相当于关系数据库的schema,定义索引的字段,类型,还有搜索策略,分词等搜索相关属性

2.1.3 搜索/过滤

Elasticsearch查询分两部分,搜索和过滤,搜索模糊搜索,计算文档与搜索词相似(匹配)度,得出分数排序,分数越高相似度越高,排序也靠前;过滤相当于sql的where,结果是true或者false

2.1.4 esdsl装配映射

es dsl搜索功能非常丰富,可调参数多,但也很难用,更难复用,onesearch设计装配映射组件支持通用表达式转换esdsl,用户只需编写通用表达式,如,((f1=‘a’or f2=’b’) and f3=‘c’)) 即可实现搜索过滤,类似elasticsearch自身也提供了sql查询功能,大大降低开发难度,同时具备高复用性

2.2 搜索特性

1. 搜索框,用户输入搜索词

2. 高级搜索,构建搜索过滤表达式,如,(x==’a’ and (y=’abc*’ or z > 100)),支持=,<>, in, 前缀匹配,模糊匹配,括号,not/and/or等

3. 统计区,聚合搜索功能,针对搜索内容统计,如文档的类型计数,一般展示不超过3项,多于3行点击””查看

4. 标题/内容,搜索返回展示,带高亮

5. 文档extras属性(M2),文档的专有属性,如,视频的播放时间

3 架构

3.1 总体功能架构

Ø schema,定义索引结构,包括字段,字段类型,字段格式,索引策略,搜索策略等,管理索引及其搜索特性

Ø es dsl装配映射引擎,装配/映射通用表达式为es dsl,支持=,!=,like,in,range,prefix,not/and/or,大小括号,点(.)等操作符映射,解决es dsl难使用,难复用的痛点

Ø 聚合(agg), xml定义agg schema,零编码增加统计主题

Ø 表达式,构建通用表达式,如,((f1=‘a’or f2=’b’) and f3=‘c’))

Ø 抽象接口, 接入不同的搜索引擎,如,elasticsearch,opensearch,solrcloud等,可同时使用多种引擎

Ø 增量同步,支持cdc,轮询(marker组件),message等方式

Ø 抓取组件,抓取索引数据,如文档,数据库

Ø suggester (TBD自动纠正/自动补全

4 搜索引擎组件架构

onesearch 1.0设计文档有详细介绍,这里简单回顾一下

总体与1.0区别不大,重构了esdsl装配与映射模块;增加spring-starter,支持spring boot的自动配置

5 索引组件架构

索引组件的架构图

reader/transformer/writer datax作业组件组合,reader读取文档内容,属性+内容的形式;writer写入索引

组件支持文件目录从数据库读取,setl-data提供统一的dao接口,无缝切换不同的驱动;marker支持轮询增量的组件,若数据库支持事务log,可使用setl-data的cdc组件

file-storage 文档(流)载入组件,支持多库多协议

document-extractor 文件解释内容抓取,核心使用tika

6 文档索引

本章介绍文档索引各组件的详细设计和实现细节

6.1 文件存取组件(file-storage)

文档索引首先需要载入文档,文档读取两个关键,文档地址读写协议,file-storage提供统一FileService接口,桥接地址和协议,提供多库多协议读取能力;

组件根据url,如,schema://rootUrl/, 选择对应FileService

组件目前支持本地磁盘,smb,ali oss,ftp,minio

6.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,然后释放流和删除临时文件

写入阶段仍然需要流生成内存字节,但缩短内存使用时间

6.3 转换组件(transformer)

转换增加StreamRecord,支持大容量文本以文件流形式传递,转换的设计参考 《SETL基于规则的转换组件设计说明书.docx》

6.4 Reader组件

Reader组件两个职责,读取文档目录/分片;读取文档/抓取内容/构建Record

6.5 Writer组件

Writer依赖onesearch组件,onesearch提供的索引服务,因此writer实现非常简单

索引使用StreamRecord传递数据,根据onesearch getter机制获取索引属性,实现StreamRecordValueGetter

关于onesearch getter组件参考《搜索引擎onesearch 1.0-设计与实现.docx》

6.6 分布式索引

下图简单回顾一下分布式索引技术架构

client 负责写入任务组分片;触发 worker 执行;client 可集成到管理台;作业监管,检测作业完成,清理作业环境

watcher 作业统计,输出统计;按作业分片观测和聚合计算; watcher 可集成到管理台

worker 分配分片;任务(组)执行,任务组执行统计

Ø 分片设计

1. 表分段

数据按splitsize分页,并按某一单调递增字段升序排列,获取每个分页的上界/下届作为任务分片信息

分片任务分页获取数据,where条件加上 >=上界 and <=下界

2. 哈希

任务获取分派的hash,分页获取数据,只处理hash散列入列数据

7 全文搜索-esdsl装配映射组件

2.0 对装配映射组件重构,支持完整的映射,增加了query,返回字段支持;1.0 支持 filter,高亮,分页,排序

Ø 装配/映射抽象模型

装配映射组件思路:搜索请求由多个模块有机组合而成

SearchAssemble 装配器,调用SearchBlockMapping生成模块,组装成可执行搜索请求,模板变量T是可执行请求类型

SearchBlockMapping 模块的映射器,接受SerchConfigBean,映射为搜索请求的模块,模板变量T是映射生成结果类型,P接受配置类型,

OperatorMapping 表达式映射器

Ø Elasticsearch实现

基于模板的装配/映射实现

elasticsearch的esdsl有由以下块(Block)构成:

查询映射块,接收QueryPropertis配置,QueryPropertis有两个映射策略,Match和Query String,

查询映射块调用filter映射块,构建filter部分,filter映射块调用表达式映射块转换filter表达式为esdsl,组成filter块,再嵌入到查询块构建完整的查询映射块查询映射块模板变量T是QueryBuilder类型(WrapperQueryBuilder),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属性

8 spring boot starter

onesearch组件增加spring boot starter支持,上图展示自动配置的组成

ES* 引擎层配置,目前只有es实现,直接import到自动配置

9 SDK

本章介绍onesearch作为SDK使用及其效果

9.1 依赖

组件支持spring boot自动配置,应用依赖spring starter即可

Ø 索引应用依赖

<dependency>

<groupId>cn.xxx.onesearch</groupId>

<artifactId>onesearch-index-starter</artifactId>

<version>${onesearch.vision}</version>

</dependency>

Ø 搜索应用依赖

<dependency>

<groupId>cn.xxx.onesearch</groupId>

<artifactId>onesearch-search-starter</artifactId>

<version>${onesearch.vision}</version>

</dependency>

9.2 编写schema

索引schema如关系数据库的schema,定义索引字段,类型,搜索相关属性

index 索引名称

id 索引文档id字段,名称对应fields定义的字段

isSource 索引是否保留source,这里必须true,返回字段只有source返回

fields 定义索引的字段,可设置属性name,alias,type,是否存储(indexed),是否索引(stored),搜索分词器,分词器,针对日期类型的格式属性(format),搜索策略等

特别地,字段alias “_content”是保留字,用于大容量的文本,以流形式,减少内存的消耗

9.3 构建索引和mapping

构建索引和mapping相当于关系数据库的生成库和表

构建索引和mapping跟具体搜索引擎紧密相关,只有引擎层服务,没有服务层,通常在实施阶段完成

IndexSettings 索引的属性配置,分片数,分片复制数,默认的分词器*

*schema字段可单独设置分词器,包括搜索分词器(search_analyzer),索引分词器(analyzer),支持中文分词器ik_smart, ik_max_words

构建后head插件查看

9.4 编写索引转换

转换同rbt一致,参考《SETL基于规则的转换组件设计说明书.docx》

当前版本支持数据库读取文档目录

9.5 索引datax配置

Reader 配置,storage是文件存储组件配置,支持多存储

Writer 配置,主要是onesearch配置

9.6 es文档索引

es文档索引 数据对象写入elasticsearch

针对大容量的文本有如下优化

文件流的形式,设置StreamRecord的content属性,以磁盘空间代替内存

Ø 自定义getter

组件提供默认的getter,通过反射获取索引bean的值

但有些场景需要自定以getter,如,文档索引需要从StreamRecord或者字段值,开发者提供自己的getter

9.7 文档搜索

searchWords 搜索词

filterExp 搜索过滤表达式

aggKey 聚合搜索key

Ø 返回实体类型

搜索默认返回map, 有时候返回实体很有必要,实体可直接用于面向对象的服务层

配置返回类型库 ResultClazzRepository,map结构,key是索引名称,value是索引返回的实体类型

Ø 过滤表达式语法

下面分别展示了,term,in,range,时间range,前缀匹配,模糊匹配,并支持多层括号嵌套,not/and/or逻辑连接

9.8 聚合搜索

聚合搜索对搜索范围的统计

聚合搜索主题通过agg schema配置,示例中的doc-agg对搜索结果范围的type字段 terms桶聚合,size字段 range桶聚合

返回的结果

同搜索结果,聚合结果也支持ResultClazz设置返回类型,返回实体结果,默认是Map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

中间件XL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值