Elasticsearch基础及python *** 作

Elasticsearch基础及python *** 作,第1张

Elasticsearch基础及python *** 作 一、ES基础

官方文档:Elasticsearch: 权威指南 | Elastic

1、名词对比mysql ElasticSearchMySQLIndex索引Database数据库Type类型Table表document文档Row行Field字段Column列Mapping处理规则Schema关系

 索引库(indices):indices是index的复数,代表许多的索引,等价于关系型数据库中的数据库(Database)

类型(type):类型是模拟mysql中数据库下面有N张表(Table)的概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念

文档(document):存入索引库原始的数据。比如每一条商品信息,就是一个文档,等价于一个数据库表(Table)下的数据由多行(ROW)

字段(field):文档中的属性,相当于一个数据库表(Table)下的多列(column,属性)

映射配置(mappings):字段的数据类型、属性、是否索引、是否存储等特性等价于在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系

待完善 

分片(shard):数据拆分后的各个部分
副本(replica):每个分片的复制 

详细参考:elasticsearch架构及名词解释_时间总在嘲笑i的博客-CSDN博客

2、 *** 作 对比mysql

在数据库中的增insert、删delete、改update、查select *** 作等价于ES中的增PUT、删Delete、改POST、查GET 

MySQL 中的 group by、avg、sum 等函数类似于 ES 中的 Aggregations 的部分特性。

MySQL 中的去重 distinct 类似 ES 中的 cardinality *** 作。

3、常用语句 新建索引
PUT /my_index
{
    "settings": { ... any settings ... },
    "mappings": {
        "type_one": { ... any mappings ... },
        "type_two": { ... any mappings ... },
        ...
    }
}

例:
PUT es_index
{
  "settings": {
    "index": {
      "number_of_shards": "10",  //分10个片
      "number_of_replicas": "1"  //1个备份
    }
  },
  "mappings": {    
    "properties":{
        "message":{
            "type":"string"
        },
        "price":{
            "type":"string"
        },
        "tid":{
            "type":"string"
        },
        "user":{
            "type":"string"
        }
    }
}

详细参考:elasticsearch mapping设置_时间总在嘲笑i的博客-CSDN博客_elasticsearch mapping 时区

查看映射关系
GET /索引名/_mapping
查询索引的设置
GET /索引名/_settings
新建/更新数据
PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

例:
PUT /weather/d1/1
{
"age":1,
"name":"zs",
"bri":"2018-08-08"
}
删除一条指定数据
DELETE  /{index}/{type}/{id}
{
  "field": "value",
  ...
}

例:
DELETE  weather/d1/2
删除索引
#删除一个索引
DELETE /my_index
#删除多个索引
DELETE /index_one,index_two
DELETE /index_*
#删除所有索引
DELETE /_all
DELETE /*
查询数据
#查询一条数据
GET {index}/{type}/{id}
#查询所有数
GET {index}/_search
#条件查询
GET {index}/_search?q=Field:value

 对于查询返回结果的解释:空搜索 | Elasticsearch: 权威指南 | Elastic

json-查询
GET {index}/_search
{
    "query":{
      "match_all": {}
    }
}

更多参考:深入搜索 | Elasticsearch: 权威指南 | Elastic

 

二、 python *** 作es

官方文档:Python Elasticsearch Client — Elasticsearch 7.16.3 documentation

1、安装elasticsearch

pip install elasticsearch

2、连接
from elasticsearch import Elasticsearch
 
 
class ElasticSearchClass(object):
 
    def __init__(self, host, port, user, passwrod):
      
        http_auth = user + ":" + passwrod 
        self.es = Elasticsearch(
            [host],
            port=port,
            http_auth=http_auth,
            # sniff_on_start=True,  # 启动前嗅探es集群服务器
            sniff_on_connection_fail=True,  # es集群服务器节点连接异常时是否刷新es节点信息
            sniff_timeout=60  # 每60秒刷新节点信息
        )
3、常用 *** 作 创建索引
    @retry(tries=3)
    def create_index(self, index_name, mapping):

        self.es.indices.create(index=index_name, ignore=400)
        self.es.indices.put_mapping(index=index_name, body=mapping)
插入一条数据 
def insert(self, index, type, body, id=None):
        '''
        插入一条body给指定的index、指定的type下;
        可指定Id,若不指定,ES会自动生成
        :param index: 待插入的index值      
        :param body: 待插入的数据  # dict型
        :param id: 自定义Id值
        :return:
        '''
        return self.es.index(index=index,doc_type=type,body=body,id=id,request_timeout=30)
查询一条数据
def get(self, doc_type, indexname, id):
        # index中具体的一条
        return self.es.get(index=indexname,doc_type=doc_type, id=id)
根据索引进行搜索
#通过index搜索数据  其中,搜索之后数据显示默认为十条数据
def searchindex(self, index):
        """
        查找所有index数据
        """
        try:
            return self.es.search(index=index)
        except Exception as err:
            print(err)
查找index下所有符合条件的数据
 def searchDoc(self, index=None, type=None, body=None):
        '''
        查找index下所有符合条件的数据
        :param index:
        :param type:
        :param body: 筛选语句,符合DSL语法格式
        :return:
        '''
        return self.es.search(index=index, doc_type=type, body=body)
 更新其中具体的一条
def update(self, doc_type, indexname,  body=data, id):
        # 更新其中具体的一条
        return self.es.update(index=indexname,doc_type=doc_type,  body=data, id=id)
 统计类 *** 作
def count(self, indexname):
        """
        :return: 统计index总数
        """
        return self.conn.count(index=indexname)

def proportion_not_null(self, index, field=None):
        """非空统计"""
        a = self.count(index)['count']
        b = self.count(index, {'query': {'bool': {'must': {'exists': {'field': 
                                                                     field}}}}})['count']
        print(field, a, b, b / a)
 
    def aggs_terms(self, index, field, size=15):
        """单字段统计"""
        return self.search({
            'aggs': {
                'CUSTOM NAME': {
                    'terms': {
                        'field': field,
                        'size': size,  # 解决aggs显示不全
                    }
                }
            }
        }, index)['aggregations']['CUSTOM NAME']['buckets']
删除索引下所有的数据
def clear_index(index):
    body ={
        "query": {
            "match_all": {
            }
        }
    }

    self.es.delete_by_query(index,body)
删除索引中具体某一条
#数据删除时候是根据id进行删除 
def delete(self, indexname, doc_type, id):
        """
        :param indexname:
        :param doc_type:
        :param id:
        :return: 删除index中具体的一条
        """
        self.es.delete(index=indexname, doc_type=doc_type, id=id)
 删除所有索引
def delete_index(self, index):
        # 删除所有索引
        if not index:
            for index in es.indices.get("*"):
                es.indices.delete(index)
        else:
            es.indices.delete(index)
三、安装requests模块,通过GET、POST方式 *** 作Elasticsearch 

参考:python Elasticsearch5.x使用 - shhnwangjian - 博客园

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5711636.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存