廊坊seo整站优化,网站维护工作的基本内容,上传网站程序是什么,.net网站 开发1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性#xff0c;搜索schema#xff0c;agg#xff0c;表达式搜索映射#xff0c;本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为… 1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性搜索schemaagg表达式搜索映射本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 Ø 文档 Document elasticsearch 一行数据称为文档需要注意与文件/文档区分有冲突的地方用“ES文档”区分 Ø 索引schema 相当于关系数据库的schemaxml格式定义索引的字段类型还有搜索策略分词等搜索相关属性 Ø 搜索/过滤 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 大规模/分布式文件索引 Ø 文档抓取 1) 文档内容抓取组件metadata(baseextras)content 2) 抓取组件隔离机制 Ø 索引引擎基于分布式dataX支持批量/增量 2.2 精确搜索/多元搜索 Ø 装配/映射 增加支持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支持!likeinrangeprefixnot/and/or大小括号点(.)等操作符映射解决es dsl难使用难复用的痛点 Ø 抽象搜索引擎接口无缝接入不同的搜索引擎如elasticsearchopensearchsolrcloud等更可同时使用多种引擎 Ø 同步全量同步/增量同步接入分布式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 组件目前支持本地磁盘smbali ossftpminio 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定时执行全量不需要