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

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

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

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,搜你想搜

相关推荐

Micheal Nielsen's神经网络学习之二

依然是跟着MichaelNielsen的神经网络学习,基于前一篇的学习,已经大概明白了神经网络的基本结构和BP算法,也能通过神经网络训练数字识别功能,之后我试验了一下使用神经网络训练之前的文本分类,...

CocoaPods + XCTest进行单元测试 c单元测试工具

在使用XCTest进行单元测试时,我们经常会遇到一些CocoaPods中的开源框架的调用,比如“Realm”或“Alamofire”在测试的时候,如果配置不当,会导致“frameworknotfo...

Java基础知识回顾第四篇 java基础讲解

1、&和&&的区别作为逻辑运算符:&(不管左边是什么,右边都参与运算),&&(如果左边为false,右边则不参与运算,短路)另外&可作为位运算符...

项目中的流程及类似业务的设计模式总结

说到业务流程,可能是我做过的项目中涉及业务最多的一个方面了。除了在流程设计之外,在一些考核系统、产业审批、还有很多地方,都用到相似的设计思路,在此一并总结一下。再说到模式,并不是因为流行才用这个词,而...

联想三款显示器首批获得 Eyesafe Certified 2.0 认证

IT之家7月31日消息,据外媒报道,三款全新联想显示器是全球首批满足EyesafeCertified2.0的设备。据报道,联想获得EyesafeCertified2.0认证的显...

maven的生命周期,插件介绍(二) 一个典型的maven构建生命周期

1.maven生命周期一个完整的项目构建过程通常包括清理、编译、测试、打包、集成测试、验证、部署等步骤,Maven从中抽取了一套完善的、易扩展的生命周期。Maven的生命周期是抽象的,其中的具体任务都...

多线程(3)-基于Object的线程等待与唤醒

概述在使用synchronized进行线程同步中介绍了依赖对象锁定线程,本篇文章介绍如何依赖对象协调线程。同synchronized悲观锁一样,线程本身不能等待与唤醒,也是需要对象才能完成等待与唤醒的...

jquery mobile + 百度地图 + phonegap 写的一个"校园助手"的app

1jquerymobile+百度地图+phonegap写的一个"校园助手"的app,使用的是基于Flat-UI的jQueryMobile,请参考:https://github.com/...

Apache 服务启动不了 apache系统服务启动不了

{我是新手,从未遇到此问题,请各位大大勿喷}事由:今天早上上班突然发现公司网站出现问题。经过排查,发现是Apache出现问题。首先检查配置文件没有出问题后,启动服务发现Apache服务能启动,但是没法...

健康债和技术债都不能欠 公众号: 我是攻城师(woshigcs)

在Solr4.4之后,Solr提供了SolrCloud分布式集群的模式,它带来的主要好处是:(1)大数据量下更高的性能(2)更好扩展性(3)更高的可靠性(4)更简单易用什么时候应该使用Sol...

Eye Experience怎么用?HTC告诉你 eyebeam怎么用

IT之家(www.ithome.com):EyeExperience怎么用?HTC告诉你HTC上周除了发布HTCDesireEYE自拍机和HTCRE管状运动相机之外,还发布了一系列新的智能手机...

Android系统应用隐藏和应用禁止卸载

1、应用隐藏与禁用Android设置中的应用管理器提供了一个功能,就是【应用停用】功能,这是针对某些系统应用的。当应用停用之后,应用的图标会被隐藏,但apk还是存在,不会删除,核心接口就是Packag...

计算机软件技术分享--赠人玫瑰,手遗余香

一、Netty介绍Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty...

Gecco爬虫框架的线程和队列模型 爬虫通用框架

简述爬虫在抓取一个页面后一般有两个任务,一个是解析页面内容,一个是将需要继续抓取的url放入队列继续抓取。因此,当爬取的网页很多的情况下,待抓取url的管理也是爬虫框架需要解决的问题。本文主要说的是g...

一点感悟(一) 初识 初读感知的意思

时间过得很快,在IT业已从业了两年多。人这一辈子到底需要什么,在路边看着人来人往,大部分人脸上都是很匆忙。上海真是一个魔都,它有魅力,有底蕴,但是一个外地人在这里扎根置业,真的是举全家之力,还贷3...