WebGIS中興趣點簡單查詢、基於Lucene分詞查詢的設計和實現

文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/前端

1.前言

興趣點查詢是指:輸入框中輸入地名、人名等查詢信息後,地圖上能夠展現出對應信息所在的地址,而且根據需求以不一樣方式展現出相關地址的屬性信息等。sql

以百度地圖爲例:數據庫

                       

2.原理

所謂興趣點查詢,也就是前臺輸入描述信息後,後臺根據該描述信息在地理數據庫中查詢到符合查詢信息的地理數據和與此對應的屬性數據,而後將數據返回給前臺,前臺進行展現。具體流程圖以下:微信

 

3.數據採集

所謂巧婦難爲無米之炊,地理相關數據的獲取是該功能可否成功以及效果是否知足需求的核心。在實際項目中,地理數據的來源通常有如下幾種方式:網絡

a.公司本身或外包給其餘公司進行興趣點數據採集。函數

b.由甲方或者與甲方合做的第三方公司提供數據或者相應數據獲取的API接口。此種方式下,爲了後期擴展,若是能夠將對方數據拉取存入己方設計好的相關表中,爲最佳方式。工具

c.無數據來源,靠網絡爬蟲進行數據收集。優化

4.數據入庫

當數據準備好後,咱們最一般採用的方式就是對數據進行入庫管理。設計

首先,須要根據具體業務需求,對興趣點表進行符合實際狀況的設計。blog

其次,即是對興趣點表中數據的注入。經常使用的有兩種方式,一種是將圖層數據入庫,而後在數據庫中寫存儲過程將該入庫數據進行組織後插入到興趣點表中。第二種即是開發知足需求的小工具,而後利用小工具將圖層數據組織後注入到興趣點表中。

5.傳統興趣點查詢的實現

最簡單的實現方式,就是在興趣點表建好後,直接對該表進行sql查詢。根據需求,也能夠選擇使用Like等進行模糊查詢。因爲實際項目中的興趣點數據基本不會過十萬條,對錶的優化沒有很明顯的要求。

如下是一個最簡單的興趣點表所包含的內容:

 

查詢sql後就能夠返回該興趣點所在座標和描述信息。

6.基於分詞的興趣點查詢的實現

可是,若是用戶輸入的描述信息過於複雜呢,好比輸入的是湖北省武漢大學,而咱們數據庫中只有武漢大學四個字的描述信息,那麼用戶將沒法查到想要的信息。或者,用戶輸入的是漢語拼音呢?固然,目前有些數據庫,好比Oracle是提供了拼音查漢字的函數,可是首先這不是全部數據庫都有的功能,其次,一樣存在對複雜拼音沒法細分的狀況。而且,數據庫中LIKE是比較耗資源的,使用過多容易鎖表。

那麼,是否有更好的解決方案來解決這個問題呢?下面我將跟你們淺談一下分詞技術,和基於支持分詞技術的Lucene的簡單開發。

6.1中文分詞和分詞原理

吳軍博士在其《數學之美》一書中,對語音識別(馬爾科夫鏈)、信息度量(香農定理及延伸定理)等等搜索方面的知識進行了深刻淺出的描述,雖然我不是研究搜索方面的人士,看後也是很有收穫。在此書中,他專門花了一個篇幅來說解中文分詞。此處我便對其中內容大體作一個總結。

 

6.1.1中文分詞的難點

在科學家最開始研究分詞技術時,提出的研究方法是利用文法、語義來進行分詞。可是這種方法有兩個重要的困難,一個是:數據量大,即想經過文法規則覆蓋哪怕是20%的真實語句,文法規則的數量至少是幾萬條;第二個是:即便可以寫出涵蓋全部天然語言現象的語法規則集合,用計算機解析它也是至關的困難。

後來科學家又提出了統計方法來替代規則方法,即利用馬爾科夫鏈來創建語言統計模型。

馬爾科夫鏈是指:每一個狀態值取決於前面有限個狀態。放在分詞上即是,某種分詞的方式,只跟其經常使用的幾種分詞方式的組合平率有關係。

可是語言統計模型用在中文分詞上卻又遇到了難題,由於中文並不像英文等每一個詞語之間有明顯的空格分割,而且因爲中文的文字意思多變歸納力強大等等緣由,致使了中文分詞比英文分詞難度大不少。

6.1.2中文分詞方法的發展

6.1.2.1查字典法

把句子 「中國航天官員應邀到美國與太空總署官員開會。」 分紅一串詞:中國 / 航天 / 官員 / 應邀 / 到 / 美國 / 與 / 太空 / 總署 / 官員 / 開會。

 最容易想到的,也是最簡單的分詞辦法就是查字典。這種方法最先是由北京航天航空大學的梁南元教授提出的。

 用 「查字典」 法,其實就是咱們把一個句子從左向右掃描一遍,遇到字典裏有的詞就標識出來,遇到複合詞(好比 「上海大學」)就找最長的詞匹配,遇到不認識的字串就分割成單字詞,因而簡單的分詞就完成了。

可是該方法在複雜語義上效果很差,後來在查字典方法上衍生出了最少詞數分詞法,不過該方法在語言二意上表現也不盡如人意。

6.1.2.2基於統計語言的符合嵌套法

利用以上提到過的馬爾科夫鏈原理進行統計分詞。對於語義定義不明確的詞時,在分詞時找到符合嵌套的結構。「 北京大學」四個字,那麼先把它當成一個四字詞,而後再進一步找出細分詞 「北京」 和 「大學」。

6.1.2.3依然存在的問題

在分詞的一致性和分詞的顆粒度上存在諸多困難。

6.2基於Lucene的興趣點分詞查詢的設計和實現

6.2.1Lucene的分詞原理

Lucene使用的是倒排文件索引結構,其過程是首先基於分詞技術取得數據的關鍵字,而後基於關鍵字創建倒排索引。

舉個例子,有兩篇文章,分別是:

 

對內容簡歷索引後,獲得的結果是:

 

6.2.2 設計產生分詞索引的數據

     這裏咱們是指對興趣表的設計。爲了讓分詞中有多個關鍵字段(field),興趣點表能夠進行更加細化的設計。好比:

 

6.2.3 分詞索引的建立

6.2.3.1 建立ResultSet

 

6.2.3.2 基於ResultSet創建索引文件

實例化索引器:

 

創建索引內容:

  

關閉索引,將索引寫入硬盤:

   

 

6.2.3.3 基於索引的分詞查詢

   讀入索引:

 

   查詢關鍵字段信息的構造:

 

   開始查詢:

 

6.2.3.4拼音查詢的構造

 當上面的查詢沒有結果時,開啓拼音查詢:

 

 

6.3弊端

a.建立索引須要的時間比較長。

b.數據庫中的數據更新時,並不能自動的觸發索引文件的更新。一樣索引文件的更新也是花費大量時間。

能夠利用Spring提供的scheduling方法來進行定時觸發更新:

 

7.前端展現

前端得到返回的數據後,首先根據XY在地圖上標註出查詢結果。同時將地理數據對應的屬性數據展現在顯示面板中。其餘具體業務邏輯能夠進行定製開發。

 

                                                                 -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

                                                                           若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                  

相關文章
相關標籤/搜索