全文检索方案

news/2024/9/22 9:45:01/文章来源:https://www.cnblogs.com/pengteng/p/18333759

1.     方案概述

本文旨在设计全文搜索功能,包括数据的存储、数据权限、数据接口、数据模型等,从整体设计全文检索方案。

2.     解决方案

全文搜索解决方案主要包含两部分,数据的存储及数据的查询展示,其中数据存储方面,主要分为业务数据存储及附件存储;而数据查询展示主要是根据关键字及权限进行查询展示。

2.1.   全文检索接

 1 @RequestMapping("/es")
 2 @Api(value = "ES服务", tags = { "ES服务" })
 3 public interface IElasticsearchService {
 4 
 5     @PostMapping("/save")
 6     @ApiOperation(value="ES文件存入ES库,包括ES的更新")
 7     public ESInfoVO save(@RequestBody ESInfoVO esInfoVO);
 8     
 9     @SuppressWarnings("rawtypes")
10     @PostMapping("/batch-save")
11     @ApiOperation(value="ES文件存入ES库")
12     public Result save(@RequestBody List<ESInfoVO> esInfoVOs);
13     
14     @SuppressWarnings("rawtypes")
15     @PostMapping("/delete")
16     @ApiOperation(value="删除ES文件")
17     Result delete(@RequestBody ESInfoVO esInfoVO);
18     
19     @PostMapping("/find")
20     @ApiOperation(value="多条件查询")
21     public PageVo search(@RequestBody ESInfoRequestVO eSInfoRequestVO);
22

2.2.   全文检索模型

2.2.1.     数据存储模型

字段名称

字段含义

字段类型

是否创建索引

备注

esId

物理主键

String

如果无附件,则为业务ID,如果是有附件,则为附件ID

businessId

业务主键

String

业务主键ID

businessType

业务类型

String

业务类型:发文:dispatch

收文:receipt

知识:knowledge

信息:information

法规:statute

档案:archives

authUserIds

权限用户

String

ID,中间采用英文逗号隔开

businessTopic

业务主题

String

业务标题

businessContent

业务正文

String

业务正文

attachId

附件ID

String

附件ID

attachContent

附件内容

String

附件内容

attachName

附件名称

String

附件名称

attachPath

附件路径

String

附件路径:从附件表获取的

ext1

扩展字段1

String

 

ext2

扩展字段2

String

 

ext3

扩展字段3

String

 

ext4

扩展字段4

String

 

ext5

扩展字段5

String

 

ext6

扩展字段6

String

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2.2.     数据检索模型

字段名称

字段含义

字段类型

是否必传

备注

keyWord

检索关键字

String

检索关键字

currentUser

检索用户

String

 

moduleType

业务类型

String

业务类型:发文:dispatch

收文:receipt

知识:knowledge

信息:information

法规:statute

档案:archives

pageSize

分页大小

int

默认20

pageNum

查询页码

int

默认0

 

 

 

 

 

 

 

 

 

 

 

2.2.3.     关键模型说明

esId:ES主键,与实际业务有关联,建议:如果无附件,则为业务ID,如果是有附件,则为附件ID。备注:一个ID可能关联多个附件,因此,建议有业务的附件的情况下,主键采用附件ID。

businessId与businessType:组合可以关联到实际的业务页面。

authUserIds:授权ID,也就是有权访问用户就集合,中间用英文逗号“,”隔开。

attachPath:附件路径,该值是判断是否解析附件的依据,该附件存在于附件服务器(非影像平台)。

keyword:检索的关键字,可以是正文、主题、附件名称、附件内容等。

moduleType:检索的分类,分为:发文:dispatch、收文:receipt、知识:knowledge、信息:information、法规:statute、档案:archives。

2.3.   关键技术设计

2.3.1.     数据权限设计

针对数据权限控制,一般有三种方案:

方案一:权限单独存储,先条件检索,后过滤权限;

方案二:权限单独存储,先权限过滤,后进行检索;

方案三:权限冗余到ES中,直接进行检索过滤;

针对三种不同的方案,实现方式不同,下面我们将针对三种方案进行优劣分析,然后进行数据权限控制设计。

2.3.1.1.  方案一:权限单独存储,先条件检索,后过滤权限

 

业务流程:

  1. 发送请求,点击检索;
  2. 到ES检索数据(不考虑权限);
  3. 将检索结果存入DB的临时表中;
  4. 权限表与临时表联合查询(权限过滤);
  5. 将结果返回到检索结果页面进行渲染;
  6. 用户点击具体结果条目,根据业务ID和业务条目到业务不要进行检索;
  7. 将查询结果,显示到业务页面。

方案特点:

  1. 核心查询分3步:ES查询、结果存储、关联查询;
  2. 全文检索涉及DB与ES两个库;
  3. 多并发操作,数据量较大,业务逻辑复杂。

2.3.1.2.  方案二:权限单独存储,先权限过滤,后进行检索

 

业务流程:

  1. 发送请求,点击检索;
  2. 到DB中查询权限数据,获取业务ID;
  3. 将业务ID作为过滤条件;
  4. 根据关键字、分类及业务ID进行检索;
  5. 将结果返回到检索结果页面进行渲染;
  6. 用户点击具体结果条目,根据业务ID和业务条目到业务不要进行检索;
  7. 将查询结果,显示到业务页面。

方案特点:

  1. 核心查询分2步:DB查询、ES查询;
  2. 全文检索涉及DB与ES两个库;
  3. 多并发操作,数据量较大,查询费资源(内存、CPU、IO);
  4. 业务逻辑复杂。

2.3.1.3.  方案三:权限冗余到ES中,直接进行检索过滤

 

业务流程:

  1. 发送请求,点击检索;
  2. 根据检索条件到ES进行检索(权限就是检索条件之一);
  3. 将结果返回到检索结果页面进行渲染;
  4. 用户点击具体结果条目,根据业务ID和业务条目到业务不要进行检索;
  5. 将查询结果,显示到业务页面。

方案特点:

  1. 核心查询分1步:ES查询;
  2. 全文检索只涉及ES库;
  3. 数据抽取时,需要将权限在ES中冗余。

因此,全文检索的数据权限,采用方案三:权限冗余到数据中,直接进行检索过滤。

2.3.2.     数据操作设计

模型数据操作采用spring-data-elasticsearch,对于数据的新增、修改、删除直接使用ElasticsearchRepository提供的增删该接口即可。对于查询,由于要对好像结果进行高亮处理,不能直接使用ElasticsearchRepository提供的接口,而需要使用spring-data-elasticsearch提供的QueryBuilder、NativeSearchQuery以及ElasticsearchTemplate三个组合实现。

关键点说明:

保存:直接调用save方法即可;

更新:直接调用save方法即可;注意:只要主键esId与原先保持一致,即可进行更新;

删除:直接调用delete方法即可;

查询:QueryBuilder进行查询条件拼装;NativeSearchQuery进行关键字高亮设置;ElasticsearchTemplate根据查询条件及关键字设置进行查询并返回结果。

2.3.3.     附件解析设计

附件涉及的文件类型太多,无法一一提供,本解决方案重点在于常见附件类型,如:doc、docx、pdf、pdfx、wps,这几种附件的解析。

doc/wps解析:采用WordExtractor进行数据抽取;

docx解析:采用XWPFWordExtractor进行数据抽取;

pdf/pdfx解析:采用PDFTextStripper进行数据抽取;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/774437.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

课堂笔记 - C++ 位运算符

C++位运算符 在C++当中,有六个位操作运算符,二进制来进行操作 & 按位与 1 & 0 = 0 | 按位或 1 | 0 = 1 ~ 按位非 0 取反变成 1 1取反变成0 ^ 异或 相同为0 不同为1 << 左移 二进制往左靠,右侧补零 >> 右移 二进制往右靠,左侧补零 0xff = 很明…

netty核心流程(二):客户端与服务端的读写过程

连接成功建立后,客户端是如何向服务端发送请求的? 由于内部源码的调用过于复杂,我们只分析有代表性的代码。在 AbstractChannel 类中我们可以看到: wirte() 方法最后会把发送的数据 msg 放入 addMessage() 方法中,这个方法是做什么的呢? 原来把要发送数据放入一个缓冲链…

P1168 中位数题解

题目链接:https://www.luogu.com.cn/problem/P1168 题目描述:给定一个长度为 N 的非负整数序列 A,对于前奇数项求中位数。 思路讲解:最简单的想法就是每次取我们要的那段数组然后排序在输出中位数。确实可以,但是太慢了,直接超时。那就是说要缩短时间,那就可以直接用到堆…

Qt/C++音视频开发80-ffmpeg实现srt推拉流/实时性非常好/音视频同步/支持格式众多

一、前言 目前互联网上的视频直播有两种,一种是基于RTMP协议的直播,这种直播方式上行推流使用RTMP协议,下行播放使用RTMP,HTTP+FLV或者HLS,直播延时一般大于3秒,广泛应用秀场、游戏、赛事和事件直播,满足了对交互要求不高的场景;另一种是WebRTC协议的直播,这种直播方式…

一款基于Fluent设计风格、现代化的WPF UI控件库

前言 今天大姚给大家分享一款基于Fluent设计风格、开源(MIT License)、现代化的WPF UI控件库,它提供直观的设计、主题、导航和全新的沉浸式控件,全部都是原生且无缝地集成在一起:WPF UI。WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应…

很幸运,AppStore审核一遍过!——深海记词

极速过审 从2023年9月开始学习iOS开发,终于在24年6月正式开发完成了第一款用于学英语、背单词的APP《深海记词》。 最近在上海出差,闲暇之余开始着手制作商店页海报,做完后就急不可耐的提交了审核。 我是在周六晚上提交的审核,周天早上显示受理审核,下午就显示通过了审核�…

异或哈希

理论基础异或哈希是个很神奇的算法,利用了异或操作的特殊性和哈希降低冲突的原理,可以用于快速找到一个组合是否出现、序列中的数是否出现了k次https://blog.csdn.net/notonlysuccess/article/details/130959107 https://codeforces.com/blog/entry/85900 CF1175Fhttps://cod…

dotnet X11 的多屏触摸行为测试

故事的背景是我在给 Avalonia 加上触摸尺寸的支持时,代码审查过程中大佬提出了在多屏上的 X11 行为问题,为此我找了两个触摸屏进行测试 X11 的多屏触摸行为。由于我的设备有限,本文只记录我所测试到的行为给 Avalonia 加上触摸尺寸支持的功能的代码: https://github.com/Av…

WPF 不带 TargetPlatformVersion 显示 Win10 的 Toast 通知的方法

本文将告诉大家如何在 WPF 不安装 WindowsAppSDK 包,且不在 TargetFramework 带上 TargetPlatformVersion 而弹出 Win10 的 Toast 通知的方法本文这里的 TargetPlatformVersion 指的是在 TargetFramework 里面的内容,如下面的代码里的 10.0.17763.0 就是 TargetPlatformVersi…

读零信任网络:在不可信网络中构建安全系统05网络代理

网络代理1. 网络代理 1.1. 安全策略在认证和授权环节都充分地利用了多个因子,综合考虑了用户及其使用的设备的信息 1.1.1. 允许员工通过企业发放的工作笔记本电脑提交源代码,但是禁止员工使用手机进行类似操作 1.1.2. 用户必须使用可信终端提交代码,并且这个终端必须属于用户…