相关文章推荐
冷静的柳树  ·  如何用Microsoft Visual ...·  5 月前    · 
腹黑的水龙头  ·  Python 3 中 Redis ...·  1 年前    · 
刚毅的莴苣  ·  黑客利用Ruby on ...·  1 年前    · 

而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库。

当然,可以在 web 应用中存储数据的时候,再主动写一份到 elasticsearch,但这无疑污染了原有的业务逻辑。

在 IT 行业,只要有需求的地方,必然早已有了一堆好用或者不好用的开源轮子。

幸运地是,现在已经有了一些转换方案,可以将 mongodb 中的数据自动导入到 elasticsearch 中,让 elasticsearch 提供中文智能检索。

转换方案主要包括 river 和 mongo-connector 。前者已经不再维护了,后者则得到了 mongo 官方的支持,因此选用它作为转换方案。

mongo-connector

基于 python 编写,安装和使用都十分简单。

$ 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 连接起来。

这里已经提供好了 docker-compose 模板,可以使用 docker 容器一键创建包括 mongo、mongo-connector、elasticserach 的环境。需要提前安装 Docker 和 docker-compose 环境。

$ 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"}}]}}

转载请注明:http://blog.csdn.net/yeasy/article/details/47842437

而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库。当然,可以在 web 应用中存储数据的时候,再主动写一份到 elasticsearch,但这无疑污染了原有的业务逻辑。在 IT 行业,只要有需求的地方,必然早已有了一堆好用或者不好用的开源轮子。幸运地是,现在已经有了一些转换方案,可以将 mo 将 MongoDB 集合导出到 Elasticsearch 的 Python 脚本。 所有配置选项都可以设置为命令行参数或环境变量。 至少必须设置collection和database 。 可以使用mongodb_elasticsearch_connector.py --help检索完整的选项列表。 该脚本可以作为来自quay.io/wildcard/mongodb-elasticsearch-connector的 Docker 容器运行。     elasticsearch是Java语言开发的,需要jdk1.8以上版本.     在oracle官网下载jdk: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html  进入jdk所在目录,并解压到 # 这里的意思是对collection1里面所有字段类型为string的field都创建一个text索引 db.collection1.createIndex({ "$**": "text" } ) # 如果只想对指定的字段比如userName和schoolName创建text索引,则可以如下操作 db.collection1.createIndex({ "userNa spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=logs 3. 创建MongoDBAppender类,实现Appender接口,用于将日志记录写入MongoDB。 import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.AppenderBase; import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; public class MongoDBAppender extends AppenderBase<LoggingEvent> { private MongoClient mongoClient; private MongoDatabase database; private MongoCollection<Document> collection; public MongoDBAppender() { mongoClient = new MongoClient("localhost", 27017); database = mongoClient.getDatabase("logs"); collection = database.getCollection("log"); @Override protected void append(LoggingEvent event) { Document doc = new Document("timestamp", event.getTimeStamp()) .append("level", event.getLevel().toString()) .append("thread", event.getThreadName()) .append("logger", event.getLoggerName()) .append("message", event.getFormattedMessage()); collection.insertOne(doc); 4. 在logback.xml文件中添加MongoDBAppender。 <appender name="mongodb" class="com.example.MongoDBAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="mongodb" /> </root> 5. 在程序中使