一、elasticsearch的介绍及功能
elasticsearch是一个由java编写一个分部式搜索引擎,使用elasticsearch可以实现以下 功能。
- 快速的全文检索,100万数据检索不到1秒
- 提供分布式和集群
- 本身提供完善的restful接口
python应用:
- 在django或者flask使用当中,用elasticsearch代替数据库存储一部分内容。
- 在爬虫当中,使用elasticsearch进行大数据的存储。
二、elasticsearch服务器的安装搭建(Centos)
1、安装java最新的jdk(1.8版本以上)
Centos系统自带java版本为1.8.0
2、下载elasticsearch并移动至home目录下解压
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
移动到home目录下进行解压
3、创建启动elasticsearch专用的用户(es默认不允许以root身份启动)
4、创建存放elasticsearch数据和日志的目录并赋予其所有者为esuser用户
5、修改节点配置
cd到elasticsearch目录下的config目录下,找到elasticsearch.yml节点配置文件。
进行备份,然后开始配置
cd elasticsearch-6.3.1/config/
cp elasticsearch.yml elasticsearch.yml.bak
vim elasticsearch.yml
①打开注释,配置集群名称
cluster.name: my-application
②打开注释,配置节点属性
node.attr.rack: r1
③打开注释,配置数据及日志存储路径
path.data: /home/esdata/data
path.logs: /home/esdata/log
④打开注释,配置内存
bootstrap.memory_lock: true
⑤打开注释,配置网络参数
network.host: 10.10.21.130
http.port: 9200
⑥打开注释,配置静态主机列表
discovery.zen.ping.unicast.hosts: ["host1", "host2"]
⑦打开注释,配置索引分片节点
gateway.recover_after_nodes: 3
⑧打开注释,配置是否可以通过正则或者_all删除或者关闭索引
action.destructive_requires_name: true
7、编辑/etc/security/limits.conf文件,给特定用户设置持续限制
在文件结尾增加如下配置:
esuser hard nofile 65536
esuser soft nofile 65536
esuser soft memlock unlimited
esuser hard memlock unlimited
8、编辑/etc/sysctl.conf文件,设置虚拟内存最大映射数量,否则es内存报错
在文件结尾添加:
vm.max_map_count=266144
max_map_count参数解释:
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。
重新载入配置:
sysctl -p
8、启动elasticsearch服务器
切换到esuser用户下
进入到elasticsearch-6.3.1/bin/目录下,启动elasticsearch脚本,启动服务
./elasticsearch
9、访问elasticsearch服务器进行测试效果
三、python elasticsearch操作
Python 基于es的操作都是接口类型的操作,但是后来es发现Python接口操作总是离不开一段类似于爬虫的代码。Es就进行了Python接口的封装。
es的基本存储单位是索引(index),类似mysql当中的表
1、安装elasticsearch模块
pip install elasticsearch
2、编写elasticsearch脚本测试
from elasticsearch import Elasticsearch
# 连接es服务器
es = Elasticsearch(["10.10.21.130"],timeout=360)
# 插入索引
data = {
"mappings":{
"properties":{
"title":{
"type":"text",
"index":True
},
"keywords":{
"type":"text",
"index":True
},
"link":{
"type":"string",
"index":True
},
"content":{
"type":"text",
"index":True
},
}
}
}
es.indices.create(index="python-index",body=data)
# 查看索引
# es.search()