而 elasticsearch 能夠很好的支持各類語言的全文檢索,但咱們暫時又不想切換到 elasticsearch 做爲後端數據庫。python
固然,能夠在 web 應用中存儲數據的時候,再主動寫一份到 elasticsearch,但這無疑污染了原有的業務邏輯。git
在 IT 行業,只要有需求的地方,必然早已有了一堆好用或者很差用的開源輪子。github
幸運地是,如今已經有了一些轉換方案,能夠將 mongodb 中的數據自動導入到 elasticsearch 中,讓 elasticsearch 提供中文智能檢索。web
轉換方案主要包括 river 和 mongo-connector。前者已經再也不維護了,後者則獲得了 mongo 官方的支持,所以選用它做爲轉換方案。mongodb
基於 python 編寫,安裝和使用都十分簡單。docker
$ pip install mongo-connector $ mongo-connector --auto-commit-interval=0 -m mongo:27017 -t elasticsearch:9200 -d elastic_doc_manager
auto-commit-interval 是提交延遲,0 表示即時寫入,-m 和 -t 分別指定 mongo 和 elasticsearch 地址便可。數據庫
須要注意的是,mongo 須要配置爲 cluster 模式。後端
用戶能夠自行配置 mongo 和 elasticsearch 環境,並經過 mongo-connector 鏈接起來。curl
這裏已經提供好了 docker-compose 模板,能夠使用 docker 容器一鍵建立包括 mongo、mongo-connector、elasticserach 的環境。須要提早安裝 Docker 和 docker-compose 環境。elasticsearch
$ git clone https://github.com/yeasy/docker-compose-files.git $ cd mongo-elasticsearch; docker-compose up
經過 docker inspect container_id |grep Addr
能夠查看容器的 IP 地址。
在 mongo 容器中寫入數據
> use test > db.col.insert({name:"王曉明", birth:"1980-01-01"}) > db.col.insert({name:"王東東", birth:"1981-01-01"}) > db.col.insert({name:"張麗敏", birth:"1982-01-01"})
經過 elasticsearch 容器進行檢索
curl -XGET -H 'charset=UTF-8' elasticsearch:9200/test/col/_search -d '{ "query" : { "match" : { "name" : "王" } } }' {"took":74,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max_score":0.5,"hits":[{"_index":"test","_type":"col","_id":"55d6d4640e247e587cfc73ca","_score":0.5,"_source":{"name": "\u738b\u4e1c\u4e1c", "birth": "1981-01-01"}},{"_index":"test","_type":"col","_id":"55d6d45d0e247e587cfc73c9","_score":0.15342641,"_source":{"name": "\u738b\u6653\u660e", "birth": "1980-01-01"}}]}}