写点什么

统一搜索引擎 onesearch 设计 - 概述

作者:X
  • 2022 年 1 月 11 日
  • 本文字数:2326 字

    阅读完需:约 8 分钟

统一搜索引擎 onesearch 设计-概述

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 支持索引/文档,查询返回

表达式语法修改,更符合通常的认知

用户头像

X

关注

还未添加个人签名 2020.03.15 加入

还未添加个人简介

评论

发布
暂无评论
统一搜索引擎 onesearch 设计-概述