美文网首页微服务性能测试
python对es基础的增删改查

python对es基础的增删改查

作者: 互联网中的一个咸鱼 | 来源:发表于2019-11-22 21:52 被阅读0次

    安装API

    pip3 install elasticsearch  # pip自动安装最新版本
    

    python对索引进行操作

    建立es连接
    
    from elasticsearch import Elasticsearch
    
    # 默认host为localhost,port为9200.但也可以指定host与port
    es = Elasticsearch()
    
    创建索引
    # 创建自定义的索引
    es.indices.create(index="index003")
    
    删除索引
    es.indices.delete(index="index003")
    
    判断索引存在
    es.indices.exists(index="index003")  # 会返回布尔值
    
    对索引加入mapping
    mapping = {
        'properties': {
            'title': {
                'type': 'text',
                'analyzer': 'ik_max_word',
                'search_analyzer': 'ik_max_word'
            }
        }
    }
    es.indices.create(index='index001')
    result = es.indices.put_mapping(index='index001', doc_type='_doc', body=mapping)
    

    创建了一个新的索引,并且更新了他的mapping信息,mapping 信息中指定了分词的字段

    python对索引的文档进行操作

    插入数据
    es.index(index="my_index",doc_type="test_type",id=0,body={"name":"python","addr":"深圳"})
    
    es.create(index="index003",doc_type="_doc",id=1,body={"name":"jpx","age":30})
    

    运行结果如下:

    {'_index': 'news', '_type': 'politics', '_id': '1', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}
    

    结果中 result 字段为 created,代表该数据插入成功。

    另外其实我们也可以使用 index() 方法来插入数据,但与 create() 不同的是,create() 方法需要我们指定 id 字段来唯一标识该条数据,而 index() 方法则不需要,如果不指定 id,会自动生成一个 id

    数据插入成功之后,如何查看是否插入成功,如何插入成功就会查找到该数据,查看数据如下

    获取数据
    #get: 获取指定index、type、id所对应的文档
    es.get(index="my_index",doc_type="test_type",id=1)
    
    # search:查询满足条件的所有文档,没有id属性,且index,type和body均可为None
    result = es.search(index="my_index")  # 获取这个索引的所有数据
    result = es.search()  # 获取所有索引的所有数据
    

    用search会查找到多个数据,结果会出现在hits字段里面,
    其中total字段标明了查询的结果条目数,max_source代表了最大匹配分数

    删除数据
    #删除指定的index、type、id的文档
    es.delete(index='indexName', doc_type='typeName', id=1)
    
    更新数据
    #update:更新指定index、type、id所对应的文档
    #更新的主要点: 
    #1. 需要指定 id 
    #2. body={"doc": <xxxx>} , 这个doc是必须的
    es.update(index="my_index",doc_type="test_type",id=1,body={"doc":{"name":"python1","addr":"深圳1"}})
    

    更新数据结果如下

    {'_index': 'news', '_type': 'politics', '_id': '1', '_version': 2, 'result': 'updated', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 1, '_primary_term': 1}
    

    可以看到返回结果中,result 字段为 updated,即表示更新成功,另外我们还注意到有一个字段 _version,这代表更新后的版本号数,2 代表这是第二个版本,因为之前已经插入过一次数据,所以第一次插入的数据是版本 1,可以参见上例的运行结果,这次更新之后版本号就变成了 2,以后每更新一次,版本号都会加 1。

    另外更新操作其实利用 index() 方法同样可以做到
    index() 方法可以代替我们完成两个操作,如果数据不存在,那就执行插入操作,如果已经存在,那就执行更新操作,非常方便。

    查询数据高级
    from elasticsearch_dsl.connections import connections    ##导入的模块
    from elasticsearch_dsl import Search
    
    es = connections.create_connection(hosts=['10.0.122.124'])   ## 连接到装有ela的主机上
    search = Search(using=es, index="nginx--filebeat-7.4.2-2019.11.22").filter(
         "match", clientip="221.228.109.90").query("match",clientip="221.228.109.90").
    res = es.execute()     #使用execute方法将这个查询给提交到ela中
    print(res)
    print(es.count())
    
    ##返回的是一个<Response:  >对象 需要循环才能够得到
    # for item in es:
    #     print(item.age, item.name)
    print(es.to_dict())
    #结果是将上面的过滤条件变成字典{'query': {'bool': {'filter': [{'match': {'response': '200'}}], 'must': [{'match': {'clientip': '123.244.101.255'}}]}}}
    

    几个字段的意义

    using  
        指明用那个已经连接的对象
    query  
        接收的是查询体语句
    exclude
        接收的是不匹配的字段 就像 must_not
        
    filter
        接收的是过滤语句 ,过滤的条件意思是在返回结果中有这些条件的信息  
    

    相关文章

      网友评论

        本文标题:python对es基础的增删改查

        本文链接:https://www.haomeiwen.com/subject/izaqwctx.html