再见esdsl,搜索引擎 elasticsearch扩展,使用通
1. 背景
互联网时代,也是用户量为王的时代,海量的用户对系统的高并发高吞吐提出新的要求,搜索引擎搜索性能高数据库百倍,是实现信息获取高并发高吞吐重要途径, 目前搜索引擎比较流行有 elasticsearch,solrcloud,opensearch,搜索引擎通常有自己的搜索表达式语法,语法晦涩难懂,开发人员很难开发可重用的应用,本框架 onesearch 支持通用表达式搜索,如,(x=’a’ and (y=’b’ or z=’c’), 支持多重括号,not and or 等语法,开发搜索变得简单和高度可重用,开发新的搜索只要传入通用表达式即可,onesearch 开发表达式映射引擎,支持不同搜索引擎的映射,目前支持 elasticsearch
*大部分搜索引擎支持 sql 语法,但通用表达式有其优势,不需要 sql 知识,要求降低,另外,表达式非常适合页面构建
2. 参考和术语
倒排索引
Lucene/elasticsearch
3. 逻辑架构
Øschema 模块,使用 xml,定义索引结构,包括字段,字段类型,字段格式,索引策略,搜索策略等,管理索引及其搜索特性
Ø映射引擎,映射通用表达式为 es dsl,支持=,!=,like,in,range,prefix,not/and/or,大小括号,点(.)等操作符映射,解决 es dsl 难使用,难复用的痛点
Ø聚合(agg)/分面(facing),基于schema 模块,支持 xml 定义 agg schema,零编码增加 agg 主题
Ø表达式,负责构建/解释通用表达式,如,((f1=‘a’or f2=’b’) and f3=‘c’))
Ø抽象搜索引擎接口/映射引擎, 支持接入不同的搜索引擎,如,elasticsearch,opensearch,solrcloud 等,更可同时使用多种引擎
Ø数据库增量同步,引入 canal,非侵入索引增量同步
Ø文档抓取,抓取 word,pdf,xlsx,jpg,视频。。。等内容和元素据, 使用 tika,爬虫式抓取;自研的抓取框架,精确抓取
Ø suggester Api 自动补全 (TBD
4. 设计
4.1 总体设计
api 目前输出搜索 api
聚合搜索(agg)/全文搜索(fulltexg)/索引和文档 服务层,与具体搜索引擎无关
装配/映射/表达式 映射引擎,装配器,表达式遍历,操作符映射接口等抽象设计
适配 索引/文档/搜索的具体引擎实现;操作符映射具体引擎实现;agg 实现,agg 不在表达式映射
suggester/geo 自动补全,地理搜索,目前未实现
4.2 详细设计
索引模式(schema),索引,文档,查询表达式,装配映射,搜索,agg(agg schema/aggregation 模型),抽象引擎适配(抽象引擎接口,映射)
1) 索引模式
索引模式(schema)定义索引,包括索引字段名称,别名,索引属性,分词设置,格式,搜索策略等
索引模式如同数据库表定义,有了索引定义,很好地管理索引,精确设置索引,搜索的策略,提高搜索精度,索引模式使用 xml 定义
索引模型:
NestedField 支持内嵌对象字段,及其数组
聚合搜索模式:
2) 索引
索引组件,用于构建索引,依赖索引模式;
3) 文档
文档模块负责文档写入,更新,删除;文档支持 pojo,组件设计了 setter 框架,从 pojo 获取索引字段值
Ø 使用模式 alias 反射获取值,支持 bean 字段与索引字段不一样
Ø 支持集成 i18n,枚举,写入索引前转换值
Ø 通过索引模式设置 getter,提供极大灵活性
4) 表达式
表达下模块负责表达式构建,解释
5) 装配映射
映射分为搜索映射,聚合映射
a) 搜索映射
搜索表达式 抽象成模板,有多块构成
装配器(ExpAssemble)解释模板,抓取出块名字,获取块映射,块映射解释表达式,使用运算符映射,转换表达式为具体搜索引擎搜索表达式
b) 聚合映射
映射最终生成 Aggregation,Aggregation 放到搜索表达式
6) 全文搜索/聚合(分面)搜索
全文搜索/agg 是一体,agg 基于搜索结果
搜索支持返回 dto,或者 map
agg 设计与搜索一致,定义 agg schema,映射 mapping
7) 抽象引擎适配
具体引擎实现,文档服务,搜索服务,表达式映射实现
5 核心流程
针对技术分析重点,详细分析各重点设计, 以时序图展示
5.1 索引
1.0 client 调用文档服务的 addDocument,参数 IndexResource,携带了索引对象 pojo,文档流(如果有抓取文档)
1.1/1.3 获取文档索引模型
以下遍历索引模式
1.4 获取索引字段
1.6 通过索引字段 getter 配置,获取 getter
1.9 使用 getter 获取字段值,传入 pojo,字段 alias
1.11 字段值放入 map 容器
遍历结束
1.12 调用引擎的文档服务,传入索引字段/字段值 map 容器和索引模式
5.2 搜索
1.0 用户在页面构建搜索表达式,调用查询服务
1.1/1.2 查询服务构建搜索请求(SearchRequest),调用搜索 api,支持微服务/SDK 方式
1.3 参数检验
1.4 参数转换,如分页,表达式分块
1.5 表达式装配映射,解释查询模板,抓取表达式块
1.6 表达式块映射
1.7/1.8 运算符映射,递归
1.9 返回表达式项,合并表达式
1.10 返回完整搜索表达式
1.11/1.12 调用具体搜索引擎
1.13/1.14 如果索引设置了返回类型,转为为 bean,如果没有,直接返回 map
1.15 异常处理,返回码
6 组件架构
onesearch-engine
可以是微服务方式,也可以本地 sdk
查询服务 支持页面构建搜索表达式
数据采集 主要用于文档,如 word,pdf 等内容抓取
数据同步 canal 非侵入增量同步
7 工程结构
adapter 适配器,底层搜索引擎实现,目前有 elasticsearch 实现
api/common 搜索 API
index 文档索引模块,历史原因,初始版本 index,document 同一个模块,此模块应为 doc
mapping 表达式映射
query 搜索表达式
schema 索引模式
search 搜索/聚合
web 打包,微服务
9 代码
https://download.csdn.net/download/szlhj/75369043
10 规划(TODO)
spring
springboot index starter
springboot search starter
springboot schema starter
装配/映射 支持 query,目前映射为 filter
Text 查询映射策略
term
match
match_phrase
query_string
nested 查询,目前 nested 支持索引/文档,查询返回
表达式语法修改,更符合通常的认知