elasticsearch提供river這個模組來讀取資料來源中的資料到es中,es官方有提供couchDB的同步外掛程式,因為項目用到的是mongodb,所以在找mongodb方面的同步外掛程式,在git上找到了elasticsearch-river-mongodb。
這個外掛程式最初是由aparo寫的,最開始的功能就是讀取mongodb裡面的表,記錄最後一條資料的id,根據時間間隔不斷訪問mongodb,看看有沒有大於之前記錄的id的資料,有的話就索引資料,這種做法的缺點就是只能同步最新的資料,修改或刪除的就不能同步。後來又由richardwilly98等人修改成通過讀取mongodb的oplog來同步資料。因為mongodb是通過oplog這個表來使叢集中的不同機器資料同步的,這樣做的話可以保證es裡面的資料和mongodb裡面的是一樣的,因為mongodb中的資料一有改變,都會通過oplog反映到monogodb中。他們還添加了個索引mongodb
gridfs裡檔案的功能,非常好。
但他們修改完後的外掛程式還是有些不滿意的地方。他把local庫(放oplog的)和普通庫的訪問密碼都設定成同一個,如果local庫和普通庫的使用者名稱和密碼不同那這個外掛程式就不能用了。還有一個就是同步時會把mongodb的表中所有的欄位都同步過去,但是有些欄位我們並不想把它放到索引中,於是對這個外掛程式再作修改,把local庫和普通庫的鑒權分開,添加可選欄位功能。
運行環境:Elasticsearch 0.19.X
叢集環境下的MongoDB 2.X
注意:該外掛程式只支援叢集環境下的mongodb,因為叢集環境下的mongodb才有oplog這個表。
安裝方法:
安裝elasticsearch-mapper-attachments外掛程式(用於索引gridfs裡的檔案)
%ES_HOME%\bin\plugin.bat -install elasticsearch/elasticsearch-mapper-attachments/1.4.0
安裝elasticsearch-river-mongodb(同步外掛程式)
%ES_HOME%\bin\plugin.bat -install laigood/elasticsearch-river-mongodb/laigoodv1.0.0
建立river方法:
curl方式:
$ curl -XPUT "localhost:9200/_river/mongodb/_meta" -d '{ type: "mongodb", mongodb: { db: "test", host: "localhost", port: "27017", collection: "testdb", fields:"title,content", gridfs: "true", local_db_user: "admin", local_db_password:"admin", db_user: "user", db_password:"password" }, index: { name: "test", type: "type", bulk_size: "1000", bulk_timeout: "30" }}
db為同步的資料庫名,
host mongodb的ip地址(預設為localhost),
port mongodb的連接埠,
collection 要同步的表名
fields 要同步的欄位名(用逗號隔開,預設全部)
gridfs 是否是gridfs檔案(如果collection是gridfs的話就設定成true)
local_db_user local資料庫的使用者名稱(沒有的話不用寫)
local_db_password local資料庫的密碼(沒有的話不用寫)
db_user 要同步的資料庫的密碼(沒有的話不用寫)
db_password 要同步的資料庫的密碼(沒有的話不用寫)
name 索引名(不能之前存在)
type 類型
bulk_size 大量新增的最大數
bulk_timeout 大量新增的逾時時間
java api方式:
client.prepareIndex("_river", "testriver", "_meta") .setSource( jsonBuilder().startObject() .field("type", "mongodb") .startObject("mongodb") .field("host","localhost") .field("port",27017) .field("db","testdb") .field("collection","test") .field("fields","title,content") .field("db_user","user") .field("db_password","password") .field("local_db_user","admin") .field("local_db_password","admin") .endObject() .startObject("index") .field("name","test") .field("type","test") .field("bulk_size","1000") .field("bulk_timeout","30") .endObject() .endObject() ).execute().actionGet();
本外掛程式git地址:https://github.com/laigood/elasticsearch-river-mongodb
本文地址:http://blog.csdn.net/laigood12345/article/details/7691068
參考資料:http://www.searchtech.pro/articles/2013/02/18/1361191176552.html