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


    现状

    在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、丰富的接口扩展能力、映射可自定义、全面的索引数据类型等特点。

  • 相关阅读:
    【Express】服务端渲染(模板引擎 EJS)
    CAN协议解析
    mysql的日期与时间函数,varchar与date相互转换
    macOS磁盘分区调整软件--Paragon Camptune X 中文
    lab1-4 PE结构
    postgresql源码学习(41)—— 崩溃恢复③ - 日志来源
    进程,线程切换
    多线程JUC 第2季 ReentranctLock实现加锁和解锁过程
    华为鸿蒙4谷歌GMS安装教学
    CSS中主要定位方式
  • 原文地址:https://www.cnblogs.com/vjmap/p/16187410.html