由于项目中数据量太大,直接查询很慢,建立索引开销也挺大,所以考虑搭建个搜索引擎,考虑过solr,sphinx,最终还是选择了es,原因在于mongodb到es有一个现成的中间件mongo-connector,当然solr也可以用这个,不过ES貌似更有朝气点,主要是配置更简单,原谅我都没用过。。。第一次只能选择最简单的

好了闲话休提,说正事。

服务器

14.04.1-Ubuntu 内存8G 4核CPU,有点可怜。。

java环境

es是java开发的,所以需要配置java环境,因为es5x,所以装个java8

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default

安装ElasticSearch

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb http://packages.elastic.co/elasticsearch/1.6/debian stable main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install elasticsearch
sudo update-rc.d elasticsearch defaults 95 10

mongo端

  1. 安装mongodb

如果没有安装mongodb,则

sudo apt-get install mongodb

注意这样安装的mongodb版本是2.4.9,当时没注意,后来才傻眼了,偷懒的后果,没办法升级太麻烦,将就用,最好是下载源码安装,这里就不说了

  1. 开启复制集
    先停掉mongodb服务
sudo pkill mongod

MongoDB 必须开启复制集,通过–replSet设置副本,开启mongodb

sudo mongod --replSet rsEs --config /etc/mongodb.conf
  1. 初始化副本集
liurh@ubuntuNas02:~$ mongo
MongoDB shell version: 2.4.9
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
> rs.initiate()
{
  "info2" : "no configuration specified. Using a default configuration for the set",
  "me" : "b48eafd69929:27017",
  "ok" : 1
}

安装mongo-connector

mongo-connector工具是基于python开发的实时同步服务工具,该工具在MongoDB与目标系统间同步数据,并跟踪MongoDB的oplog,保持操作与MongoDB的实时同步。 它要求mongo运行在replica-set模式,且需要 elastic2_doc_manager将数据写入ES。
github地址:https://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch
我们ES用的是Elasticsearch 5.x,所以对应安装

sudo pip install 'mongo-connector[elastic5]'

如果提示pip没装,则先安装pip

sudo apt-get install python-pip

安装elastic2-doc-manager

sudo pip install elastic2-doc-manager

启动mongo-connector

sudo mongo-connector -m localhost:27017 -t localhost:9200 -d elastic2_doc_manager &

遇到的坑

  1. 索引问题

ES会自动对mongodb的数据在建立索引,所以这里有个坑:

因为mongodb的特性,同一个字段在不通的文档里可能是不同的数据类型,所以,假如索引中对该字段建立数据类型integer,但是有些数据是string,强制类型转换不了,则会报错

es vs mongo 新能对比 选es还是mongodb_mongodb


解决办法是关闭自动创建,手动创建索引,/etc/elasticsearch/elasticsearch.yml文件中

action.auto_create_index: false

手动创建索引,把那个字段改为string类型

curl -XPOST "http://127.0.0.1:9200/wechat_nas/wechat_db/_mapping?pretty" -d '{
  "wechat_db": {
    "properties": {
      "create_at": {
        "type": "long"
      },
      "secret": {
        "type": "string"
      },
      "url": {
        "type": "string"
      },
      "wid": {
        "type": "string"
      }
    }
  }
}'

重启因报错而退出的进程mongo-connector,这样就ok了

  1. json问题
  2. es vs mongo 新能对比 选es还是mongodb_es vs mongo 新能对比_02

  3. 这个问题把我折腾的都怀疑人生了,问题出在最后一个字段的逗号上,把逗号去掉就ok了
  4. 重建索引问题
    发现自动建立的索引不是太合理,比如数字类型全部建成了long, 我想改成byte,才发现字段特么只能增,不能改,如果要改,只能删除索引,重建,我晕。。。
    查了下资料,也可以用索引别名去无缝重建然后切换,不过我就直接删除重建了

常用ElasticSearch操作

#查看mapping
curl -XGET "http://127.0.0.1:9200/wechat_nas/resource/_mapping?pretty"

#创建mapping
curl -XPOST "http://127.0.0.1:9200/wechat_nas/message"

#删除
curl -XDELETE "http://127.0.0.1:9200/wechat_nas/message"

#修改mapping
curl -XPOST "http://127.0.0.1:9200/wechat_nas/wechat_db/_mapping?pretty" -d '{
     "wechat_db": {
                "properties": {
                     "type":{
                        "type":"long"
                   }
                }
            }
    }'

#清空所有数据
curl -XDELETE "http://127.0.0.1:9200/wechat_nas/wechat_db/_query" -d '{
        "query" : { 
            "match_all" : {}
        }
    }'

#查询范围内数据
curl -XGET http://127.0.0.1:9200/wechat_nas/rcontact/_search?pretty -d '{
    "query" : { 
        "range" : {
            "utime":{
                "gte":1507685559
            }
        }
    }
}'
#模糊查询
curl -XGET http://127.0.0.1:9200/wechat_nas/rcontact/_search?pretty -d '{
    "query" : { 
        "match" : {"username":"ELLA"}
    }
}'
#分页查询
curl -XGET http://127.0.0.1:9200/wechat_nas/message/_search?from=0&size=10
#查询数量
curl -XGET http://127.0.0.1:9200/wechat_nas/message/_count?pretty -d '{
    "query" : { 
        "match" : {"wid":"XD6718"}
    }
}'
#精确查找
curl -XGET http://127.0.0.1:9200/wechat_nas/message/_count?q=wid:XD6718
curl -XGET http://127.0.0.1:9200/wechat_nas/message/_search?pretty -d '{
    "from" : 0, 
    "size" : 10,
    "query" : { 
        "term" : {"wid":"XD6718"}
    },
    "sort": [
        {
            "createTime": "desc"
        }
    ]
}'