全文检索方案

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进行数据抽取;

posted @ 2024-07-31 08:52  奔跑的鹏腾  阅读(3)  评论(0编辑  收藏  举报