Python连接ElasticSearch
python🔗一切
基于python建立与ElasticSearch的连接
// 加载相关库
from elasticsearch5 import Elasticsearch
import pandas as pd
// 定义ES连接函数,参数分别为ES服务器地址和ES复合查询语句
def func_ESQuery(query_url, table_name, query_body):
es = Elasticsearch(query_url)
// index表示数据库中的表名,body为ES复合查询语句-类SQL查询语句但会复杂一点,scroll表示游标有效期,request_timeout表示请求时长60s-若60s无响应会终止查询,size表示查询最大返回大小为10000条-数值太大会报错。
query = es.search(index=table_name, body=query_body, scroll='20m', request_timeout=60, size=10000)
results = query['hits']['hits']
total = query['hits']['total'] # es查询出的结果总量
print(total)
scrl_id = query['_scroll_id']
for i in range(round(total / 10000)):
print(i)
res = es.scroll(scroll_id=scrl_id, scroll='20m')
results += res['hits']['hits']
df_test = pd.DataFrame(results)
return df_test
// ES服务器地址和端口号,一般默认端口号为9200
es_url = "http://xx.xx.xxx.xxx:9200/"
// 查询语句
query_json = {"query": {"bool": {"filter": [{"term": {"":""}},{"range": {"time": {"gte":"", "lt":""}}}]}},
"_source": [""], "sort":[{"时间字段":{"order":"asc"}}]} //最关键的是写查询体,类似写sql语句
// term对应的是单个关键分词搜索,格式是string; terms对应的是多个或的关系的分词的搜索,格式是list
trytimes = 0
while trytimes <= 5:
try:
df_conn =func_ESQuery(es_url,table_name,query_json)
print("查询成功")
df_pro = df_conn['_source']
df_to_list = df_pro.values.tolist()
list_to_df = pd.DataFrame(df_to_list)
print(list_to_df.head())
// 在这之后可以写处理数据的核心算法了
trytimes = 1
break
except
print('连接错误,第{}次重试...'.format(trytimes))
trytimes += 1
加了一个while语句,是考虑到ES连接出现不稳定等因素。