如何在Web前端實現CAD圖文字全文搜尋功能之技術分享

vjmap發表於2022-04-24

現狀

在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、豐富的介面擴充套件能力、對映可自定義、全面的索引資料型別等特點。

相關文章