微服务性能测试

python对es基础的增删改查

2019-11-22  本文已影响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
    接收的是过滤语句 ,过滤的条件意思是在返回结果中有这些条件的信息  
上一篇 下一篇

猜你喜欢

热点阅读