对MongoDB中的数据进行搜索(2)

MongoDB在大多数的情形中都是作为数据存储的模块而被使用,作为一个数据库,一般不应该承担更多的任务。

从专业性的角度来说,将文本搜索的任务交由专业的搜索引擎来负责,往往是更好的选择。

常用的搜索引擎与MongoDB往往都有着现成的工具,可以方便的进行结合。

1、Sphinx与mongodb-sphinx

Sphinx是一个C++编写的文本搜索引擎,其本身与MySQL结合的非常好,可以非常方便的从MySQL中导入数据。

对于其他的数据库来说,Sphinx并不提供原生的支持,但是Sphinx提供了xmlpipe2接口,任何程序只要实现了相应的接口就可以与Sphinx进行数据交互。

对于MongoDB来说,mongodb-sphinx(https://github.com/georgepsarakis/mongodb-sphinx)就是一个xmlpipe2接口的实现。

mongo-sphinx中带有一个stackoverflow的样例数据,以及运行的参数样例,只需要将样例数据导入MongoDB再执行以下的命令即可实现数据向sphinx的导入

./mongodb-sphinx.py -d stackoverflow -c posts --text-fields profile_image link --attributes last_activity_date _id --attribute-types timestamp string --timestamp-from=1366045854 --id-field=post_id

常用的参数包括:

-d 指定数据库,-c指定集合,-H指定MongoDB的地址,-p指定MongoDB的端口

-f起始时间戳,-u结束时间戳,-t需要建立搜索索引的字段

-a不索引的属性,--attribute-types为-a中的属性指定属性类型包括字符串,时间戳,整数等等

--id-field用作文档ID的字段,--threads线程数

非常重要的一点在于,mongodb-sphinx默认MongoDB数据中的_id为ObjectID,即带有时间信息的ID,所以如果需要使用自己的ID系统则在时间判断上会出现问题,需要自行修改代码。

2、ElasticSearch和Mongo-Connector

在es2.0及之前的版本中,经常用到的与MongoDB之间进行数据结合的是mongodb-river。

不过在es5之后的版本中,插件已经无法再想之前的版本一样安装,所以网上的mongodb-river教程都无法使用。

同时mongodb-river已经有几年没有更新,可能对es5的支持不如别的程序。

MongoDB官方提供了类似的工具Mongo-Connector(https://github.com/mongodb-labs/mongo-connector)

安装方法非常简单:pip install mongo-connector

Mongo-Connector支持多种不同的搜索引擎,对于es来说支持1.x,2.x,5.x等多个版本,只需要安装对应的doc-manager

也可以直接使用,pip install ‘mongo-connector[elastic5]‘安装,即可直接使用。

使用之前,需要将MongoDB切换为副本集模式,这样MongoDB才会记录oplog。

$ mongod --replSet singleNodeRepl
$ mongo
> rs.initiate()
# MongoDB is now running on port 27017

之后,编辑一个配置文件,例如配置密码信息等:

{"authentication": {"password": XXX}}

官方自带了一个配置文件的样例:

{
    "__comment__": "Configuration options starting with ‘__‘ are disabled",
    "__comment__": "To enable them, remove the preceding ‘__‘",

    "mainAddress": "localhost:27017",
    "oplogFile": "/var/log/mongo-connector/oplog.timestamp",
    "noDump": false,
    "batchSize": -1,
    "verbosity": 0,
    "continueOnError": false,

    "logging": {
        "type": "file",
        "filename": "/var/log/mongo-connector/mongo-connector.log",
        "__format": "%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s",
        "__rotationWhen": "D",
        "__rotationInterval": 1,
        "__rotationBackups": 10,

        "__type": "syslog",
        "__host": "localhost:514"
    },

    "authentication": {
        "__adminUsername": "username",
        "__password": "password",
        "__passwordFile": "mongo-connector.pwd"
    },

    "__comment__": "For more information about SSL with MongoDB, please see http://docs.mongodb.org/manual/tutorial/configure-ssl-clients/",
    "__ssl": {
        "__sslCertfile": "Path to certificate to identify the local connection against MongoDB",
        "__sslKeyfile": "Path to the private key for sslCertfile. Not necessary if already included in sslCertfile.",
        "__sslCACerts": "Path to concatenated set of certificate authority certificates to validate the other side of the connection",
        "__sslCertificatePolicy": "Policy for validating SSL certificates provided from the other end of the connection. Possible values are ‘required‘ (require and validate certificates), ‘optional‘ (validate but don‘t require a certificate), and ‘ignored‘ (ignore certificates)."
    },

    "__fields": ["field1", "field2", "field3"],

    "__namespaces": {
        "excluded.collection": false,
        "excluded_wildcard.*": false,
        "*.exclude_collection_from_every_database": false,
        "included.collection1": true,
        "included.collection2": {},
        "included.collection4": {
            "includeFields": ["included_field", "included.nested.field"]
        },
        "included.collection5": {
            "rename": "included.new_collection5_name",
            "includeFields": ["included_field", "included.nested.field"]
        },
        "included.collection6": {
            "excludeFields": ["excluded_field", "excluded.nested.field"]
        },
        "included.collection7": {
            "rename": "included.new_collection7_name",
            "excludeFields": ["excluded_field", "excluded.nested.field"]
        },
        "included_wildcard1.*": true,
        "included_wildcard2.*": true,
        "renamed.collection1": "something.else1",
        "renamed.collection2": {
            "rename": "something.else2"
        },
        "renamed_wildcard.*": {
            "rename": "new_name.*"
        },
        "gridfs.collection": {
            "gridfs": true
        },
        "gridfs_wildcard.*": {
            "gridfs": true
        }
    },

    "docManagers": [
        {
            "docManager": "elastic_doc_manager",
            "targetURL": "localhost:9200",
            "__bulkSize": 1000,
            "__uniqueKey": "_id",
            "__autoCommitInterval": null
        }
    ]
}

  

之后执行mongo-connector -c config.json命令即可开始进行数据同步。

时间: 2024-11-18 05:32:43

对MongoDB中的数据进行搜索(2)的相关文章

使用highcharts显示mongodb中的数据

1.mongodb数据表相关 # 显示数据库 show dbs # 数据库 use ceshi # 显示表 show tables # 创建集合 db.createCollection('infoB') # 复制数据 db.item_infoA.copyTo('infoB')# 使用命令导入json 格式的数据mongoimport -d database_name -c collection_name inpath/file_name.json# 使用命令导出json 格式的数据mongoex

mongodb中的数据建模

一对一的关系:Embed,比如用户信息集合有Address字段,Address字段有省.市.县三个字段.建模如下: 一对多关系:一篇文章有多条评论,为1对多关系 由于MongoDB对单个文档(document)有大小限制16M(高于v1.8),设计时也要将这个限制纳入考虑中. 多对多关系:学生和课程是多对多的关系,一个学生可以选多门课程,一门课程有多名学生参与. 多对多使用了连接(Linking),连接是通过引用(References)来连接两个集合.MongoDB References有两种:

PHP 从 MongoDb 中查询数据怎么样实现

一.软件环境(版本非必须) php v5.6 扩展:MongoDB nginx v1.11 mongodb v3.2 note: 必须安装MongoDB扩展 二.连接 $client = new MongoClient($server, $option); $server 变量是个字符串,描述要连接的服务器 mongodb://[username:[email protected]]host1[:port1][,host2[:port2:],...]/db 其中必要的是: username 数据

JAVA-查看MongoDB中的数据(包含List集合)

package com.xinsight.server; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mo

JAVA-查看MongoDB中的数据(包含Map集合)

package com.xinsight.server; import java.net.UnknownHostException; import java.util.HashMap; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.Mongo; /** *查找Mongo

从mongodb中查询数据

连接mongodb: public class GenericMga{ private DB db; public DB getDB(){ return this.db; } public void setDB(DB db){ this.db = db; } } DBCollection coll = null; coll=getDB().getCollection("collName");//保存时候的名字相当于MySQL的表名 创建查询条件: BasicDBObject query

如何在Mongodb中实现数据超时自动删除功能?

在工作过程中,我们难免会遇到这样的问题,我们想保存一些数据,但是我们对这些数据的要求并不高,有时候往往只是想要某个时间范围内的数据,比如我们如果永远只关心从当前时间往前推半年内的数据特性,那么我们就不需要将所有数据都保存起来,因为不仅浪费磁盘空间,而且随着数据量的不断累积,其他性能也会受到影响. 这时候我们迫切的需要一直方法能够在我们插入数据的时候自动的帮我们去删除我们过一段时间就不想要的数据,那么怎么实现呢? 在Mongodb内部,有一个特殊的索引,称为TTL索引,通过该索引便可以实现上面的功

MongoDB中的数据导出为excel CSV 文件

1.打开命令行,进入我们所安装的mongodb路径下的bin文件夹 2.我们采用bin文件夹下的mongoexport方法进行导出, mongoexport -d myDB -c user -f _id,name,password,adress --csv -o ./user.csv -d  标示 数据库 -c   标示  数据表 -f   需要提取的field用逗号分隔 -o  输出路径

JAVA API从MongoDB中读取数据

<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.2.2</version> </dependency> import java.util.ArrayList; import org.bson.Document; import java.util.List; import