3

如何在Web前端实现CAD图文字全文搜索功能之技术分享 - vjmap

 2 years ago
source link: https://www.cnblogs.com/vjmap/p/16187410.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在CAD看图过程中我们经常会需要用到查找文字的功能,在AutoCAD软件查找一个文字时,可以通过打开左下角输入命令find,输入查找的文字,然后设置查找范围,就可以搜索到需要查询的文字。但在Web网页端打开CAD图查找文字时,有没有同样的办法呢?另外,如果有没有办法实现在很多图纸中像百度那样做到全文检索的功能?

CAD图Web打开展示

拿之前分享的一款开源的利用最新技术栈Vue3开发的 唯杰地图云端图纸管理平台为例. 他实现了对AutoCAD格式的DWG图纸的云端管理查看功能。能对CAD图纸在线上传、打开、查看、版本管理; 在线图层管理切换查看功能; 属性数据查询功能等功能。

图中文字查找

图纸中文字查找方案

方法一 直接后台读取CAD图纸内容,遍历所有的文字实体进行查找。

主要的文字实体包括 单行文本AcDbText,多行文本AcDbMText,属性注记AcDbAttributeDefinition,块属性AcDbAttribute

实现步骤:

(1) 在前端写代码通过内存方式在后台打开CAD图形

// 打开地图
let res = await svc.openMap({
   mapid: 'mapid', // 地图ID,(请确保此ID已存在,可上传新图形新建ID)
   mapopenway: vjmap.MapOpenWay.Memory, // 后台以内存方式打开已上传的图
})

(2) 查找文本实体,因为前端是javascript语言,不可能直接去遍历后台图形数据库,这时可以用表达式查询来后台进行查询

 let query = await svc.exprQueryFeature({
       expr: `gOutReturn := if((gInFeatureType == 'AcDbText' or gInFeatureType == 'AcDbMText' or gInFeatureType == 'AcDbAttributeDefinition' or gInFeatureType == 'AcDbAttribute' ), 1, 0);`,
       fields: "",
       limit: 100000
})

表达式语法可参考https://vjmap.com/guide/expr.html

这样查询有个缺点就是每次查询都要在后台打开CAD图形,然后再遍历图形数据库,根据表达式过滤出要查找的文字,效率低。

image-20220424195316906

方法二 通过SQL语句查询数据库来查找文字

实现步骤:

(1) 在前端写代码通过几何渲染方式在后台打开CAD图形,几何渲染方式第一次请求数据时,会在后台打开图形,然后把图形数据和属性数据会保存至空间数据库,之后请求都会在空间数据库里查询数据。

// 打开地图
let res = await svc.openMap({
   mapid: env.exampleMapId, // 地图ID,(请确保此ID已存在,可上传新图形新建ID)
   mapopenway: vjmap.MapOpenWay.GeomRender // 以几何数据渲染方式打开
})

(2) sql语句查询文字,直接上代码

 let query = await svc.conditionQueryFeature({
      //只需要写sql语句where后面的条件内容,字段内容请参考文档"服务端条件查询和表达式查询"
      // 查询所有文字(包括单行文本,多行文本、块注记文字,属性文字) 具体类型数字参考文档"服务端条件查询和表达式查询-支持的cad实体类型" https://vjmap.com/guide/svrStyleVar.html
      condition: `name='12' or name='13' or name='26' or name='27'`,
      fields: ""
})

SQL查询无需在后台再次打开CAD图形,直接使用SQL语句查询数据库,效率高。

searchtext.gif

全文检索功能

如果后台有成百上千纸图纸,怎么做到全文检索呢?

首先想到的肯定是遍历所有的图纸,然后根据要搜索的文字一个个的去查询,这样也能实现,就是图纸比较多时,性能太低了,耗时。

这里可以利用开源的全文检索库去实现。

开源的 Elasticsearch (以下简称 ES)是目前全文搜索引擎的首选。

它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。

可以在后台实时查找出所有图形的文字然后利用ES建立索引,然后利用ES去查询,根据查找的结果定位到某图某实体上。

但是ES太重量级了,也难部署,用到这种搜索功能上简直就是大材小用。

下面推荐一款轻量级的单文件部署的全文搜索开源引擎。

Bleve是一款基于Golang实现的全文搜索与索引组件库,具有简单的API、丰富的接口扩展能力、映射可自定义、全面的索引数据类型等特点。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK