安装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
接收的是过滤语句 ,过滤的条件意思是在返回结果中有这些条件的信息
网友评论