python客户端与es的通信实现批量导入,删,改,搜索查询等

前言

学习一波Elastic Search(简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎。ES是一个十分强大的搜索引擎,博主作为一个新手,在实习过程中有时候需要往ES中写数据以及取数据。博主目前只能将其当成一个数据库来用,写个博客记录一下python客户端与es的通信实现批量导入,删,改,搜索查询等操作。后期如果机会深入学习的话,还会持续更新。

这篇博文主要是实现讲解一些关于Query DSL的基本操作,以及python客户端与es的通信实现批量导入,删,改,搜索查询等基本操作。

实验环境

  • python3.7
  • Anaconda 集成环境
  • IDE Spyder
  • 操作系统:windows10
  • 依赖库 elasticsearch,cx_oracle,pandas等

python通过通用REST API请求与ES通信

REST API 相关介绍

python连接ES实现批量插入,删改,搜索查询等操作

先上代码,以后有时间的话慢慢写:

# -*- coding: utf-8 -*-
import pandas as pd
from elasticsearch import Elasticsearch
from datetime import datetime
from oracle import TestOracle
from elasticsearch.helpers import bulk

'''
下面两句代码的作用是连接ORACLE数据库,读取AI_CONCEPT_GROUP,
并且转化为标准数据帧格式
'''
test_oracle=TestOracle(-------------你的账号密码相关-------) 
                      
test = test_oracle.select_topd("select * from SCOPUS.AI_CONCEPT_GROUP")
    

'''
创建与es的通信客户端
'''
es = Elasticsearch(
    ['----你的ES服务器IP地址----']
)


#设置mapping
def set_mapping(es, index_name="content_engine", doc_type_name="en"):
    my_mapping = {
     
            "en": {
     
                "properties": {
     
                    "content": {
     
                        "type": "string"
                    },
                    "url": {
     
                        "type": "string"
                    }
                }
            }
    }
    #创建Index和mapping
    create_index = es.indices.create(index=index_name,body=my_mapping)		#{u'acknowledged': True}
    mapping_index = es.indices.put_mapping(index=index_name, doc_type=doc_type_name, body=my_mapping)		#{u'acknowledged': True}
    if create_index["acknowledged"]!=True or mapping_index["acknowledged"]!=True:
        print("Index creation failed...")


#将文件中的数据存储到es中
def set_pdtoes(es, input_file, index_name, doc_type_name):
    #读入数据
    #创建批量插入的json
    ACTIONS = []
    for line in input_file.iterrows():
        # print fields[1]
        action = {
     
            "_index": index_name,
            "_type": doc_type_name,
            "_id":line[1][0],
            "_source": {
     
                  "CONCEPTID":line[1][0],
                  "NAME_CH":line[1][1],
                  "NAME_EN":line[1][2],
                  "GROUPID":line[1][3]}
        }
        ACTIONS.append(action)
 
    # 批量处理
    success, _ = bulk(es, ACTIONS, index=index_name, raise_on_error=True)
    print('Performed %d actions' % success)


set_pdtoes(es,test,"test_concept_group","ai")



# =============================================================================
# 查询,以及搜索数据主要包括两种:get以及search,get只能获取单条数据,实际查询数据,主要用search
# =============================================================================

res = es.get(index = "test_concept_group",doc_type='ai',id = 259)

##搜索出所有文档,并且借助游标来导出结果集。

#只能搜索出前十条
res_all = es.search(index="test_concept_group",body = {
     "query":{
     "match_all":{
     }}})


'''
定义一个结果全部搜索导出,导出格式为一个列表字典
'''
def es_searchall(index,bo,s=100):
    query = es.search(index=index,body = bo,scroll='5m',size=s)
    results = query['hits']['hits'] # es查询出的结果第一页
    total = query['hits']['total']  # es查询出的结果总量
    scroll_id = query['_scroll_id'] # 游标用于输出es查询出的所有结果
    for i in range(0, int(total/s)+1):
    # scroll参数必须指定否则会报错
        query_scroll = es.scroll(scroll_id=scroll_id,scroll='5m')['hits']['hits']
        results += query_scroll  
    return results

result = es_searchall('test_concept_group',{
     "query":{
     "match_all":{
     }}},s=100)


'''
将列表字典转化为数据帧文件

'''
def dic_topd(results):
    index_value = 0
    c = pd.Series(results[0]['_source'])
    df =pd.DataFrame(columns=c.index) 
    for hit in results:
        df1 = pd.DataFrame(pd.Series(hit['_source'])).T
        df = df.append(df1)
        index_value +=1
    df.reset_index(drop=True,inplace = True)##该语句用于重置索引
    return df

dff = dic_topd(results)
     

##复合搜索查询表达式,match关键字匹配查询

'''
下面语句的作用是匹配查询出NAME_CH字段包含伸进网络的文档,并且进一步筛选出GROUPID小于5的文档
match是匹配查询,这就涉及到相关算法
bool有3类查询关系,must(都满足),should(其中一个满足),must_not(都不满足)
multi_match 查询可以在多个字段上执行相同的 match 查询:
'''
query =   {
     
    "query" : {
     
        "bool": {
     
            "must": {
     
                "match" : {
     
                    "NAME_CH" : "神经网络" 
                }
            },
            "filter": {
     
                "range" : {
     
                    "GROUPID" : {
      "lt" : 5 } 
                }
            }
        }
    }
}

'''
           
{
    "multi_match": {
        "query":    "full text search",
        "fields":   [ "title", "body" ]
    }
}
'''

result = es_searchall('test_concept_group',query,s=100)
dff = dic_topd(result)

  
'''
term与terms:
关键字匹配查term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串

'''    

body = {
     
    "query":{
     
        "term":{
     
            "GROUPID":2
        }
    }
}

body1 = {
     
    "query":{
     
        "terms":{
     
            "GROUPID":[1,2]#精确匹配搜索出含有id为1,2的文档
        }
    }
}

result = es_searchall('test_concept_group',body1,s=100)

你可能感兴趣的:(数据库相关(sql),Elasticsearch,python)