轉:使用Mongo Connector和Elasticsearch實現模糊匹配

原文來自於:http://www.csdn.net/article/2014-09-01/2821485-how-to-perform-fuzzy-matching-with-mongo-connectorgit

 
摘要:短短兩年,Mongo Connector取得了突破性的進展,用戶已經能夠經過它完成鏈接器兩邊的同步更新。而基於這個特性,其餘工具針對MongoDB內存儲文件的實時操做也成爲可能。

【編者按】本篇博文做者Luke Lovett是MongoDB公司的Java工程師,他展現了Mongo Connector通過2年發展後的蛻變——完成鏈接器兩端的同步更新。期間,Luke還展現如何經過Elasticsearch實現模糊匹配。github

如下爲譯文:mongodb

介紹數據庫

假設你正在運行MongoDB。太好了,如今已經能夠爲基於數據庫的全部查詢進行精確匹配了。如今,設想你正要在你的應用中創建一個文本搜索功能,它必須去除拼寫錯誤這個噪音,最終可能會獲得一個相近的結果。爲此,這個使人生畏的任務,你須要在Lucene、Elasticsearch和Solr裏選擇一個。可是如今你面臨這樣一個問題——這些搜索工具將如何查詢存儲於MongoDB中的文檔?以及你如何保持搜索引擎內容是最新的?安全

Mongo Connector填補了MongoDB和一些最好搜索工具(例如:Elasticsearch和Solr)之間的空白。這不只是能夠支撐從MongoDB副本集或這些系統分片集羣中導出數據,並且能夠保持這些系統之間的一致性:若是你在MongoDB中插入、更新和刪除文件,那麼這些改變會很快的經過Mongo Connector在另外一端體現。你甚至可使用Mongo Connector將操做以流的方式傳送給其餘關聯副本集,從而模擬出一個「multi-master」集羣。curl

Mongo Connector在2012年8月發佈時,那個時候它的功能簡單並缺乏容錯性。我從2013年11月開始使用Mongo鏈接器,期間獲得了MongoDB Python團隊的幫助,我很是興奮地說它的功能和穩定性已經取得了很大進步。這篇文章將介紹這些新功能,以及如何使用Mongo Connector將MongoDB操做同步到Elasticsearch(一個開源的搜索引擎)中。在這篇文章的結尾,咱們還展現如何對流入Elasticsearch中的數據實現文本查詢的模糊匹配。工具

獲取數據集post

這篇文章,咱們會來到一個流行的連接聚合網站Reddit。咱們最近添加了一個由MongoDB提供支持的數據類型安全碼,能夠很好地處理外部數據庫驅動器。這使得那些並無獲得充分控制的副本文檔得以保證其安全性。使用下面這個腳原本傳輸Reddit新發布的post,使用流的方式將新生成的Reddit post傳輸到MongoDB中。網站

 

./reddit2mongo --mongo-host localhost --mongo-port 27017

 

因爲post是通過處理的,你應該能看到標題的前20個字。這個過程會模仿你開發應用時的操做,將數據寫入MongoDB。搜索引擎

啓動Mongo Connector

下一步,咱們將啓動Mongo Connector。爲了下載和安裝Mongo Connector,你可使用pip:

pip install mongo-connector

爲了示例的正常進行,咱們假設你已經安裝好了Elasticsearch,且運行於端口爲9200的本地機器。你可使用下面的命令從 MongoDB 複製到Elasticsearch。

 

mongo-connector -m localhost:27017 -t localhost:9200 -d mongo_connector/doc_managers/elastic_doc_manager.py

 

固然,若是隻想在post標題和內容中進行文本搜索,咱們可使用Elasticsearch的字段選項來限制字段。經過這個方法,咱們能最小化所複製的數據量:

 

mongo-connector -m localhost:27017 -t localhost:9200 --fields title,text -d mongo_connector/doc_managers/elastic_doc_manager.py

 

就像你看到reddit2mongo將Reddit post以STDOUT輸出,你一樣能夠看到從Mongo Connector輸出的日誌——全部文檔都在同時發送給了ES。

彈性的搜索

如今,咱們準備使用Elasticsearch在咱們的數據集上實現模糊匹配查詢,由於它來自於MongoDB。因爲咱們直接從Reddit的網站輸出內容,所以根本沒法預測從數據集中得到的結果。以「kitten」的搜索爲例,如下爲實現代碼:

 

curl -XPOST ‘http://localhost:9200/reddit.posts/_search’ -d’{
  "query": {
    "match": {
      "title": {
        "query": "kitten",
        "fuzziness": 2,
        "prefix_length": 1
      }
    }
  }
}’

 

因爲咱們正在進行一個模糊搜索,咱們甚至能夠搜索一個並不存在的詞,例如kiten。因爲大多數人根本不注重他們的拼寫,它能夠直接實現搜索用戶隨意輸入的文本,至此,你能夠想象這個功能是多麼地強大。如下爲實現代碼:

 

curl -XPOST ‘http://localhost:9200/reddit.posts/_search’ -d’{
  "query": {
    "match": {
      "title": {
        "query": "kiten",
        "fuzziness": 2,
        "prefix_length": 1
      }
    }
  }
}’

 

模糊參數決定了下一次查詢字段匹配的最大「edit distance」, prefix_length參數則需求結果必須匹配查詢的第一個字母。這篇 文章詳細說明了這個功能的實現途徑,輸出了和正確拼寫一樣的結果。

不只是插入

儘管咱們只演示瞭如何利用從 MongoDB 到Elasticsearch的連續文件流,可是Mongo Connector不只僅是一個輸入/輸出工具。當你更新或刪除MongoDB中的文件時,那些操做也會被記錄在其餘的系統中,保持與當下的主節點同步。若是主節點在作故障轉移併產生一個回滾,Mongo Connector能刪除操做並採起正確的作法來維持一致性。

總結

這個事情的真正意義在於咱們在MongoDB和Elasticsearch裏能夠同時操做。若沒有一個相似Mongo Connector的工具,咱們不得不使用一個相似mongoexport工具去按期地從MongoDB轉儲數據至JSON,而後再上傳這些數據至一個閒置的Elasticsearch中,致使咱們空閒時沒法提早刪除文件。這大概是一件很麻煩的事,同時失去了Elasticsearch的近實時查詢能力。

儘管Mongo Connector自第一次發佈後有了長足的改進,但它仍然是一個實驗性的產品,且沒有MongoDB的官方支持。然而,我會一直致力於回答各方問題、總結功能請求,並在GithubMongo Connector頁面上提交Bug報告,也會檢查Github百科頁關於Mongo Connector的全部文檔。

原文連接: How to Perform Fuzzy-Matching with Mongo Connector and ElasticSearch(翻譯/紅葉   責編/仲浩) 

相關文章
相關標籤/搜索