由于项目中数据量太大,直接查询很慢,建立索引开销也挺大,所以考虑搭建个搜索引擎,考虑过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端
- 安装mongodb
如果没有安装mongodb,则
sudo apt-get install mongodb
注意这样安装的mongodb版本是2.4.9,当时没注意,后来才傻眼了,偷懒的后果,没办法升级太麻烦,将就用,最好是下载源码安装,这里就不说了
- 开启复制集
先停掉mongodb服务
sudo pkill mongod
MongoDB 必须开启复制集,通过–replSet设置副本,开启mongodb
sudo mongod --replSet rsEs --config /etc/mongodb.conf
- 初始化副本集
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 &
遇到的坑
- 索引问题
ES会自动对mongodb的数据在建立索引,所以这里有个坑:
因为mongodb的特性,同一个字段在不通的文档里可能是不同的数据类型,所以,假如索引中对该字段建立数据类型integer,但是有些数据是string,强制类型转换不了,则会报错
解决办法是关闭自动创建,手动创建索引,/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了
- json问题
- 这个问题把我折腾的都怀疑人生了,问题出在最后一个字段的逗号上,把逗号去掉就ok了
- 重建索引问题
发现自动建立的索引不是太合理,比如数字类型全部建成了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"
}
]
}'