python操作ES数据库「建议收藏」

python操作ES数据库「建议收藏」文章目录1、ES数据库和关系型数据库对比2、连接ES数据库3、插入数据4、查询数据1、ES数据库和关系型数据库对比一个ES集群可以包含多个索引(数据库),每个索引又包含了很多类型(表),类型中包含了很多文档(行),每个文档使用JSON格式存储数据,包含了很多字段(列)关系型数据库数据库表行列ES索引类型文档字段2、连接ES数据库fromelasticsearchimportElasticsearches=Elasticsearch([{“ho

大家好,又见面了,我是你们的朋友全栈君。

1、ES数据库和关系型数据库对比

一个ES集群可以包含多个索引(数据库),每个索引又包含了很多类型(表),类型中包含了很多文档(行),每个文档使用 JSON 格式存储数据,包含了很多字段(列)

关系型数据库 数据库
ES 索引 类型 文档 字段

2、连接ES数据库

from elasticsearch import Elasticsearch

es = Elasticsearch([{ 
   "host":"ip","port":9200}])

es.search(index='es_python')  # index:选择数据库

3、插入数据

1、创建索引(数据库)

"""索引名 es_python,ignore=400,表示忽视400这个错误,如果存在es_python时,会返回400"""
es.indices.create(index='es_python',ignore=400)

2、插入单条数据

body = { 
   'name':'刘婵',"age":6,
		"sex":"male",'birthday':'1984-01-01',
		"salary":-12000}
es.index(index='es_python',doc_type='_doc',body=body)

3、插入多条数据

doc = [
    { 
   'index':{ 
   '_index':'es_python','_type':'_doc','_id':1}},
    { 
   'name':'赵云','age':25,'sex':'male','birthday':'1995-01-01','salary':8000},
    { 
   'index':{ 
   '_index':'es_python','_type':'_doc','_id':2}},
    { 
   'name':'张飞','age':24,'sex':'male','birthday':'1996-01-01','salary':8000},
    { 
   'create':{ 
   '_index':'es_python','_type':'_doc','_id':3}},
    { 
   'name':'关羽','age':23,'sex':'male','birthday':'1996-01-01','salary':8000},
]
es.bulk(index='es_python',doc_type='_doc',body=doc)

4、查询数据

1、body指定查询条件

body = { 
   
    'from': 0,  # 从0开始
    'size': 2  # 取2个数据。类似mysql中的limit 0, 20。 注:size可以在es.search中指定,也可以在此指定,默认是10
}

# 定义过滤字段,最终只显示此此段信息
filter_path=['hits.hits._source.ziduan1',  # 字段1
             'hits.hits._source.ziduan2']  # 字段2

es.search(index='es_python', filter_path=filter_path, body=body)

2、模糊查询

body = { 
   
    'query': { 
     # 查询命令
        'match': { 
     # 查询方法:模糊查询(会被分词)。比如此代码,会查到只包含:“我爱你”, “中国”的内容
            'name': '刘'
        }
    },
  'size': 20  # 不指定默认是10,最大值不超过10000(可以修改,但是同时会增加数据库压力)
}

# size的另一种指定方法
es.search(index='es_python', filter_path=filter_path, body=body, size=200) 

3、term,精准单值查询

# 注:此方法只能查询一个字段,且只能指定一个值。类似于mysql中的where ziduan='a'
body ={ 
      
    'query':{ 
   
        'term':{ 
   
            'ziduan1.keyword': '刘婵'  # 查询内容等于“我爱你中国的”的数据。查询中文,在字段后面需要加上.keyword
         # 'ziduan2': 'liuchan'
        }
    }
}

4、terms,精准多值查询

#此方法只能查询一个字段,但可以同时指定多个值。类似于mysql中的where ziduan in (a, b,c...)
body ={ 
      
    "query":{ 
   
        "terms":{ 
   
            "ziduan1.keyword": ["刘婵", "赵云"]  # 查询ziduan1="刘婵"或=赵云...的数据
        }
    }
}

5、multi_match,多字段查询

# 查询多个字段中都包含指定内容的数据
body = { 
   
    "query":{ 
   
        "multi_match":{ 
   
            "query":"我爱你中国",  # 指定查询内容,注意:会被分词
            "fields":["ziduan1", "ziduan2"]  # 指定字段
        }
    }
}

6、prefix,前缀查询

body = { 
   
    'query': { 
   
        'prefix': { 
    
            'ziduan.keyword': '我爱你'  # 查询前缀是指定字符串的数据
        }
    }
}

# 注:英文不需要加keyword

7、wildcard,通配符查询

body = { 
   
    'query': { 
   
        'wildcard': { 
   
            'ziduan1.keyword': '?刘婵*'  # ?代表一个字符,*代表0个或多个字符
        }
    }
}
# 注:此方法只能查询单一格式的(都是英文字符串,或者都是汉语字符串)。两者混合不能查询出来。

8、regexp,正则匹配

body = { 
   
    'query': { 
   
        'regexp': { 
   
            'ziduan1': 'W[0-9].+'   # 使用正则表达式查询
        }
    }
}

9、bool,多条件查询

# must:[] 各条件之间是and的关系
body = { 
   
        "query":{ 
   
            "bool":{ 
   
                'must': [{ 
   "term":{ 
   'ziduan1.keyword': '我爱你中国'}},
                         { 
   'terms': { 
   'ziduan2': ['I love', 'China']}}]
            }
        }
    }

# should: [] 各条件之间是or的关系
body = { 
   
        "query":{ 
   
            "bool":{ 
   
                'should': [{ 
   "term":{ 
   'ziduan1.keyword': '我爱你中国'}},
                         { 
   'terms': { 
   'ziduan2': ['I love', 'China']}}]
            }
        }
    }

# must_not:[]各条件都不满足
body = { 
   
        "query":{ 
   
            "bool":{ 
   
                'must_not': [{ 
   "term":{ 
   'ziduan1.keyword': '我爱你中国'}},
                         { 
   'terms': { 
   'ziduan2': ['I love', 'China']}}]
            }
        }
    }



# bool嵌套bool
# ziduan1、ziduan2条件必须满足的前提下,ziduan3、ziduan4满足一个即可
body = { 
   
    "query":{ 
   
        "bool":{ 
   
            "must":[{ 
   "term":{ 
   "ziduan1":"China"}},  # 多个条件并列 ,注意:must后面是[{}, {}],[]里面的每个条件外面有个{}
                    { 
   "term":{ 
   "ziduan2.keyword": '我爱你中国'}},
                    { 
   'bool': { 
   
                        'should': [
                            { 
   'term': { 
   'ziduan3': 'Love'}},
                            { 
   'term': { 
   'ziduan4': 'Like'}}
                        ]
                    }}
            ]
        }
    }
}

建立连接池ES

import os
import json
from datetime import datetime
from elasticsearch import Elasticsearch, RequestsHttpConnection
from elasticsearch import Transport
from elasticsearch.exceptions import NotFoundError
 
 
class ES(object):
 
    _index = ""
    _type = ""
    
    def __init__(self, hosts):
        # 基于requests实例化es连接池
        self.conn_pool = Transport(hosts=hosts, connection_class=RequestsHttpConnection).connection_pool
 
    def get_conn(self):
        """ 从连接池获取一个连接 """
        conn = self.conn_pool.get_connection()
        return conn
 
    def request(self, method, url, headers=None, params=None, body=None):
        """ 想es服务器发送一个求情 @method 请求方式 @url 请求的绝对url 不包括域名 @headers 请求头信息 @params 请求的参数:dict @body 请求体:json对象(headers默认Content-Type为application/json) # return 返回体:python内置数据结构 """
        conn = self.get_conn()
        try:
            status, headers, body = conn.perform_request(method, url, headers=headers, params=params, body=body)
        except NotFoundError as e:
            return None
        if method == "HEAD":
            return status
        return json.loads(body)
 
    def search(self, query=None, method="GET"):
        url = "/%s/%s/_search" % (self._index, self._type)
        if method == "GET":
            data = self.get(url, params=query)
        elif method == "POST":
            data = self.post(url, body=query)
        else:
            return None
        return data
 
    def get(self, url, params=None, method="GET"):
        """ 使用get请求访问es服务器 """
        data = self.request(method, url, params=params)
        return data
 
    def put(self, url, body=None, method="PUT"):
        """ 使用put请求访问es """
        data = self.request(method, url, body=body)
        return data
 
    def post(self, url, body=None, method="POST"):
        """使用post请求访问服务器"""
        data = self.request(method, url, body=body)
        return data
 
    def head(self, url, *args, **kwargs):
        status = self.request("HEAD", url, *args, **kwargs)
        return status
 
    def delete(self, url, *args, **kwargs):
        ret = self.request("DELETE", url, *args, **kwargs)
        return ret

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137437.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • circos 可视化手册- text 篇

    circos 可视化手册- text 篇欢迎关注微信公众号 生信修炼手册 不论是 heatmap 还是 scatter histogram 反应的都是基因组上某段区域对应的 value 值的分布 这里的 value 都是数值 对于 value 是字符串的情况 专门定义了 text 这种图表类型 用于展示 看一个 text 的实例 text 在图上就是一圈的字符串标记 字符串可以添加连线 表明对应的染色体位置 配置文件的写法如下 首先看下 fil

    2025年6月15日
    1
  • Linux内核版本查看_mysql隐藏版本号

    Linux内核版本查看_mysql隐藏版本号1、使用uname命令查找Linux内核2、使用/proc/version文件查找Linux内核3、使用dmesg命令查找Linux内核版本4、使用hostnamectl命令查看Linux内核版本

    2022年10月13日
    0
  • 文件路径超过系统限制_linux文件名长度限制

    文件路径超过系统限制_linux文件名长度限制Linux在Linux系统下,可以查看limits.h头文件里面有针对NAME和PATH的最大长度限制:#ifndef_LINUX_LIMITS_H#define_LINUX_LIMITS_H……#defineNAME_MAX255 /*#charsinafilename*/#definePATH_MAX4096 /*#charsinapathnameincludingnul*/……#en

    2022年8月30日
    0
  • dedecms如何去掉底部power by dedecms 链接[通俗易懂]

    dedecms如何去掉底部power by dedecms 链接[通俗易懂]dedecms在底部有个cfg_powerby 标签,在后台的系统-》系统基本参数那里面可以编辑cfg_powerby 这个标签,可是新版的更新后还会加一个powerbydedecms链接在后台设置是不起效的打开网站的/inclue/dedesql.class.php查看第588行如下$arrs1=array(0x63,0x66,0x67,0x5f,

    2022年7月13日
    14
  • 性能优化之YUICompressor压缩JS、CSS

    性能优化之YUICompressor压缩JS、CSS性能一直是项目中比较重要的一点,尤其门户网站,对页面的响应要求是很高的,从性能角度上来讲,对于Web端的优化其中重要的一点无疑是JS、CSS文件压缩,图片的融合,尽量减小文件的大小,必免占加载时占用过多的带宽。yuicompressor无疑是一个比较好的压缩工具,是yahoo的一个开源组件,下面介绍yuicompressor压缩JS、CSS文件,及在项目中的使用yuicmpressor的使用1、首先

    2022年7月18日
    20
  • 3D游戏建模的入门学习方法及技巧

    3D游戏建模的入门学习方法及技巧选一个你感兴趣的模型利用你感兴趣的任何物品或形象的预制模型。选一个可以激发你想象,让你知道清楚知道自己的模型该是什么样子,该怎么动的模型。你可以根据自己的喜好和需要加强现有模型。预制模型可以让你在开始建模之前,体验模型的检查和操作。从简单模型入手从复杂3D模型入手,你可能会备受打击。选一个简单的结构,然后开始学习。你不仅想要学会3D建模的基本知识,还需要慢慢学习掌握不同的工具、技巧。瓶子一样的圆柱体是一个很好的入门模型。或者你可以用更简单的立方体来熟悉所有工具技巧的用法。复杂模型可能会.

    2022年5月20日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号