python 操作 Elasticsearch(一)
1、python连接elasticsearch数据库
from elasticsearch import Elasticsearch
from elasticsearch import helpers
es = Elasticsearch(['你的elasticsearch的外网连接'], http_auth=('数据库的用户名', '密码'),timeout=60,max_retries=10,retry_on_timeout=True)
2、建索引(2分片,2副本)
CREATE_BODY = {
"settings": {
"number_of_shards": 2, # 分片的个数
"number_of_replicas": 2 # 副本的个数
},
"mappings": {
"properties": {
"Id": {
"type": "keyword",
},
"name": {
"type": "keyword"
},
"adress": {
"type": "keyword"
},
"education": {
"type": "keyword"
},
"english_name": {
"type": "keyword"
},
"phone_number": {
"type": "keyword"
},
"money": {
"type": "keyword"
},
"population": {
"type": "keyword"
},
"job": {
"type": "keyword"
},
"datetime": {
"type": "keyword"
}
}
}
}
# 创建一个名为demo的表
es.indices.create(index = 'demo',body =CREATE_BODY)
3、下载一个叫elasticsearch-head的程序,可以看到索引的详细信息。
刚刚我已经创建索引了,现在通过elasticsearch-head来看一看这个索引的结构。
可以看到,已按代码创建好了索引。接下来就是添加数据了。
4、添加数据
4.1、创建对应的dataframe
先随便创建一个测试数据,再插入进去。(这里使用的方法是:创建一个dataframe,然后转json,再插入进去)。因为我比较喜欢用pandas处理数据,所以索性就用pandas的dataframe插入数据。毕竟,读取csv的时候也方便。
import pandas as pd
dict = {'Id':[1,2],'name':['赵','钱'],'adress':['广东省','湖南省'],\
'education':['小学','初中'],'english_name':['qian','zhao'],\
'phone_number':['12345678910','10987654321'],'money':[100,300],\
'population':['7','3'],'job':['doctor','student'],'datetime':['2020-09-27','2020-09-25']}
df = pd.DataFrame(dict)
4.2、插入数据
4.2.1、计算创建花了多少时间的函数
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
print('共耗时约{:.2f}秒'.format(time.time() - start))
return res
return wrapper
4.2.2、将dataframe转化为json并插入对应索引的函数
import json
def df_to_es(df):
df_as_json = df.to_json(orient='records', lines=True)
action = []
for json_document in df_as_json.split('\n'):
action.append({
'_index': 'demo',
'_type': '_doc',
'_source': json.loads(json_document)
})
if len(action) > 10000:
helpers.bulk(es, action)
action = []
helpers.bulk(es, action)
4.2.3、插入n条数据进入对应索引的函数
@timer
def batch_data_process(n,df_demo):
list = []
for i in range(n):
list.append(df_demo.to_dict(orient='records')[i])
df = pd.DataFrame(list)
df_to_es(df)
4.2.4、插入dataframe中前2条数据,并查看是否插入成功。
batch_data_process(2,df)
我们可以看到,数据已经成功插入了。其实这个插入,主要还是以字典和列表为主,之所以展示的是dataframe,是因为大部分实际情况都是从csv导出数据为dataframe,然后经过数据处理之后,再插入es的,所以随大流,分享一下我是如何将pandas的dataframe插入es的对应索引中。
5、查看数据(全部数据)
demo = es.search(index="demo",doc_type="_doc",
filter_path=["hits.hits._source.*"],size=10000)
df_demo = pd.DataFrame([demo['hits']['hits'][i]['_source'] for i in range(len(demo['hits']['hits']))])