当前位置: 首页 > news >正文

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(四)-搜索

搜索 

     搜索内容比较多,onesearch分成两部分,第一部分,Query构建,其中包括搜索词设置,设置返回字段,filter,高亮;第二部分分页和排序。第一部分是映射引擎负责,映射通用表达式为具体引擎的查询(Query)。

SearchRequest构建

构建Query

下图是服务层的搜索

1. clazzRepo类型库后面介绍,用于map 转 bean,搜索结果返回bean

2. SearchConfigBean  搜索设置,大部分默认即可用,传入优先,其中,QueryProperties包括搜索词,filter表达式,agg key;sourceField返回字段,目前支持source field

3. assemble装配映射引擎  映射引擎解释表达式按策略映射为esdsl

4. searchObj 是模板类型,对应elasticsearch8的实现是SearchRequest.Builder,v6是SearchSourceBuilder

下图是assemble实现 

1. 排除_content字段返回(如果有),该字段是文档内容,通常比较大,_content返回高亮片段

2. searchRequest.source 设置是否保留source,若保留source字段可以返回source类型字段

3. queryMapping mapTo 方法  解释表达式,按策略映射相应的esdsl,Query使用Wrapper,跟上一版本不同,需自行base64编码,以前版本不需要

装配映射引擎,block mapping映射块,如,query,highlight,agg,装配组装成完整搜索对象,即esdsl,可参考 onesearch 1.0 文档

再见esdsl,搜索引擎 elasticsearch通用表达式搜索(附源码)_es表达式检索引擎-CSDN博客

构建高亮 

高亮设置是assemble方法负责

高亮字段设置本着默认即可用的原则,如果用户没有传入,Text类型字段设置高亮,目前没有支持字段级的高亮设置,实际上字段级设置使用上很麻烦

构建完整的搜索请求

服务层调用映射引擎构建Query和高亮部分,然后传给引擎层搜索服务,处理分页,排序,agg,最后执行,结果处理

引擎层,设置分页和排序,整个SearchRequest构建完成

类型库

类型库设置索引返回对应的类型,默认情况下返回Map,设置类型库可以返回bean

上图设置了索引”pdm-document”的返回类型,Elasticsearch8 通过SearchRequest的模板类型类似的实现

nested搜索

nested使用通用表达式的“.”,如,nested.a,nested字段的a属性

为了兼容性,设置了nested enable开关,nested enabled 的OperatorMapping实现可识别”.”操作符,映射为esdsl nested path

下图示例,api层的搜索代码

对应转换后的esdsl

处理搜索结果 

搜索返回SearchResponse,包括搜索结果和agg结果,搜索结果包括高亮处理,agg结果处理放在agg章节介绍

下图搜索结果处理逻辑

  1. content 字段用于全文搜索,文档内容,系统的保留名称,为了不和业务冲突,alias名称 “_content”
  2. 结果字段使用source字段,即,索引source属性设置为true,后续可选使用doc field
  3. 设置高亮的字段,如,content,优先返回高亮片段,而不是source,高亮字段可设置,系统默认Text类型为高亮

最后返回total,用于下一页搜索,搜索展示在下一篇聚合,综合展示搜索结果

相关文章:

  • 基于Hive和Hadoop的图书分析系统
  • nodejs逐字读取文件示例
  • 防火墙详解(三)华为防火墙基础安全策略配置(命令行配置)
  • 如何恢复被删除的 GitLab 项目?
  • 前端Vue.js与后端Flask/Django协同开发指南
  • 修改DNS地址有什么影响
  • 选择更轻松:山海鲸可视化与PowerBI的深度对比
  • RP2040 C SDK GPIO和IRQ 唤醒功能使用
  • Angular与Vue的全方位对比分析
  • uni-app 封装websocket 心跳检测,开箱即用
  • 原码反码补码移码
  • 快速创建第一个Spring Boot 项目
  • 【Python】Flask-Admin:构建强大、灵活的后台管理界面
  • 避免glibc版本而报错,CentOS等Linux安装node.js完美方法
  • 展锐平台的手机camera 系统isptool 架构
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【译】理解JavaScript:new 关键字
  • 〔开发系列〕一次关于小程序开发的深度总结
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • HashMap ConcurrentHashMap
  • IDEA常用插件整理
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Javascript设计模式学习之Observer(观察者)模式
  • JavaScript新鲜事·第5期
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Nodejs和JavaWeb协助开发
  • Redis学习笔记 - pipline(流水线、管道)
  • Shell编程
  • Spring声明式事务管理之一:五大属性分析
  • vue-cli在webpack的配置文件探究
  • 程序员该如何有效的找工作?
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 如何使用 JavaScript 解析 URL
  • 事件委托的小应用
  • python最赚钱的4个方向,你最心动的是哪个?
  • 大数据全解:定义、价值及挑战
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​secrets --- 生成管理密码的安全随机数​
  • #AngularJS#$sce.trustAsResourceUrl
  • #pragma once与条件编译
  • $.ajax()方法详解
  • (13)DroneCAN 适配器节点(一)
  • (9)STL算法之逆转旋转
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (PySpark)RDD实验实战——求商品销量排行
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (学习日记)2024.01.19
  • (转)Mysql的优化设置
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (轉)JSON.stringify 语法实例讲解