百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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

csdh11 2024-11-30 14:14 30 浏览

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

NEXT

  1. 搜索权限,搜到即能看
  2. suggester,搜你想搜

相关推荐

Github霸榜的SpringBoot全套学习教程,从入门到实战,内容超详细

前言...

SpringBoot+LayUI后台管理系统开发脚手架

源码获取方式:关注,转发之后私信回复【源码】即可免费获取到!项目简介本项目本着避免重复造轮子的原则,建立一套快速开发JavaWEB项目(springboot-mini),能满足大部分后台管理系统基础开...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础...

探秘Spring Cache:让Java应用飞起来的秘密武器

探秘SpringCache:让Java应用飞起来的秘密武器在当今快节奏的软件开发环境中,性能优化显得尤为重要。SpringCache作为Spring框架的一部分,为我们提供了强大的缓存管理能力,让...

3,从零开始搭建SSHM开发框架(集成Spring MVC)

目录本专题博客已共享在(这个可能会更新的稍微一些)https://code.csdn.net/yangwei19680827/maven_sshm_blog...

Spring Boot中如何使用缓存?超简单

SpringBoot中的缓存可以减少从数据库重复获取数据或执行昂贵计算的需要,从而显著提高应用程序的性能。SpringBoot提供了与各种缓存提供程序的集成,您可以在应用程序中轻松配置和使用缓...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

1,从零开始搭建SSHM开发框架(环境准备)

目录本专题博客已共享在https://code.csdn.net/yangwei19680827/maven_sshm_blog1,从零开始搭建SSHM开发框架(环境准备)...

做一个适合二次开发的低代码平台,把程序员从curd中解脱出来-1

干程序员也有好长时间了,大多数时间都是在做curd。现在想做一个通用的curd平台直接将我们解放出来;把核心放在业务处理中。用过代码生成器,在数据表设计好之后使用它就可以生成需要的controller...

设计一个高性能Java Web框架(java做网站的框架)

设计一个高性能JavaWeb框架在当今互联网高速发展的时代,构建高性能的JavaWeb框架对于提升用户体验至关重要。本文将从多个角度探讨如何设计这样一个框架,让我们一起进入这段充满挑战和乐趣的旅程...

【推荐】强&牛!一款开源免费的功能强大的代码生成器系统!

今天,给大家推荐一个代码生成器系统项目,这个项目目前收获了5.3KStar,个人觉得不错,值得拿出来和大家分享下。这是我目前见过最好的代码生成器系统项目。功能完整,代码结构清晰。...

Java面试题及答案总结(2025版持续更新)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试场景题及答案。...

Java开发网站架构演变过程-从单体应用到微服务架构详解

Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构、集群架构、分布式架构、SOA架构和微服务架构。下面玄武老师来给大家详细介绍下这5种架构模式的发展背景、各自优缺点以及涉及到的...

本地缓存GuavaCache(一)(guava本地缓存原理)

在并发量、吞吐量越来越大的情况下往往是离不开缓存的,使用缓存能减轻数据库的压力,临时存储数据。根据不同的场景选择不同的缓存,分布式缓存有Redis,Memcached、Tair、EVCache、Aer...