刚开始学习Elasticsearch,记录在python3中的使用。
使用pip在python环境中安装elasticsearch(打开cmd输入以下语句):
pip install elasticsearch
安装完成后,在python代码中导入elasticsearch:
from elasticsearch import Elasticsearch
接着获取elasticsearch的实例对象,不传入参数则默认链接本地的,有很多种创建方式,这里使用最简单的方式:
# es = Elasticsearch("http://127.0.0.1:9200")
es = Elasticsearch()
有了实例对象以后,就可以进行增删改查等操作了:
创建索引:
在这里创建一个名为 animal 的索引,参数 ignore=400 的作用在后面讲
result = es.indices.create(index="animal",ignore=400)
print(result)
如果创建成功,打印的 result 如下所示:
{'acknowledged': True, 'shards_acknowledged': True, 'index': 'animal'}
为了说明参数 ignore=400 的作用,我们再次执行上面的创建索引语句:
result = es.indices.create(index="animal",ignore=400)
print(result)
这时程序没有抛出异常,而是返回一大段JSON字符串:
{'error': {'root_cause': [{'type': 'resource_already_exists_exception', 'reason': 'index [animal/I-7JrUmJSze-0M546i0CqQ] already exists', 'index_uuid': 'I-7JrUmJSze-0M546i0CqQ', 'index': 'animal'}], 'type': 'resource_already_exists_exception', 'reason': 'index [animal/I-7JrUmJSze-0M546i0CqQ] already exists', 'index_uuid': 'I-7JrUmJSze-0M546i0CqQ', 'index': 'animal'}, 'status': 400}
可以看到,在字符串的最后,有一个 'status': 400 ,所以,ignore=400 的作用就是,当语句执行失败,且 'status' : 400 时,不要抛出异常,而是以返回字符串的形式告诉我们。
如果我们把 ignore=400 去掉,再次执行上面的创建索引代码,则会抛出异常:
elasticsearch.exceptions.RequestError: RequestError(400, 'resource_already_exists_exception', 'index [animal/I-7JrUmJSze-0M546i0CqQ] already exists')
添加单个文档对象:
在这里,我们在刚创建的 animal 索引中指定一个 type 为 dog 的类型,并向这个类型插入数据:
在这里我们插入了一个 _id 为1的文档,文档内容为:{ 'name':'小白','age':12 }
result = es.index(index="animal",doc_type="dog",id=1,body={'name':'小白','age':12})
print(result)
打印的结果为,表示插入成功:
{'_index': 'animal', '_type': 'dog', '_id': '1', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 10, '_primary_term': 1}
使用 index 方法插入数据时,也可以不指定 id 参数,这时插入的文档对象的 _id 属性将会自动生成:
result = es.index(index="animal",doc_type="dog",body={'name':'小黑','age':15})
print(result)
这时再看打印的结果,_id 属性值将是一个自动生成的字符串:
{'_index': 'animal', '_type': 'dog', '_id': 'rpq1SmoBuv6H1-viuvKn', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}
也可以使用 create 方法出入数据,不过该方法必须指定 id 属性值:
result = es.create(index="animal",doc_type="dog",id=2,body={'name':'小黄','age':11})
print(result)
打印结果为:
{'_index': 'animal', '_type': 'dog', '_id': '2', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}
我们再把 id 参数去掉,再次使用 create 方法插入数据:
result = es.create(index="animal",doc_type="dog",body={'name':'小红','age':10})
这时程序将抛出异常
TypeError: create() missing 1 required positional argument: 'id'
获取单个文档对象:
使用 get 方法获取单个文档对象,在这里我们指定获取 index = animal 且 type = dog ,id = 1 的文档对象,在elasticsearch中,同时指定这三个值,可唯一确定一个文档对象 (返回的是一个字典类型对象,可通过 result['_source'] 获取我们刚插入的数据)
result = es.get(index="animal",doc_type="dog",id=1)
print(result)
打印结果为:
{'_index': 'animal', '_type': 'dog', '_id': '1', '_version': 1, '_seq_no': 10, '_primary_term': 1, 'found': True, '_source': {'name': '小白', 'age': 12}}
查询所有文档对象:
使用 search 方法,获取索引下的所有文档对象,在这里我们获取 index = animal 下的所有文档对象,{'query': {'match_all': {}}} 表示查找所有的对象。
result = es.search(index='animal',body={'query': {'match_all': {}}})
print(result)
打印结果为:
{'took': 1, 'timed_out': False, '_shards': {'total': 5, 'successful': 5, 'skipped': 0, 'failed': 0}, 'hits': {'total': 4, 'max_score': 1.0, 'hits': [{'_index': 'animal', '_type': 'dog', '_id': '2', '_score': 1.0, '_source': {'name': '小黄', 'age': 11}}, {'_index': 'animal', '_type': 'dog', '_id': '125', '_score': 1.0, '_source': {'name': '小白', 'age': 12}}, {'_index': 'animal', '_type': 'dog', '_id': '1', '_score': 1.0, '_source': {'name': '小白', 'age': 12}}, {'_index': 'animal', '_type': 'dog', '_id': 'rpq1SmoBuv6H1-viuvKn', '_score': 1.0, '_source': {'name': '小黑', 'age': 15}}]}}
在这里返回的依然是字典对象类型,为了更清楚的看到刚才我们刚插入的数据,在这里使用循环将数据遍历打印
result = es.search(index='animal',body={'query': {'match_all': {}}})
items = result['hits']['hits']
for item in items :
print(item['_source'])
打印结果为:
{'name': '小黄', 'age': 11}
{'name': '小白', 'age': 12}
{'name': '小白', 'age': 12}
{'name': '小黑', 'age': 15}
修改数据:
使用 update 方法修改数据,在这里,我们将 id 为 1 的文档对象的 name 属性改为“小红”
result = es.update(index='animal',doc_type='dog',id=1,body={"doc":{'name':'小红'}})
print(result)
打印结果为,每次修改或删除数据时,_version 属性都会加 1 :
{'_index': 'animal', '_type': 'dog', '_id': '1', '_version': 2, 'result': 'updated', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 11, '_primary_term': 1}
使用 index 方法也可以修改文档对象,使用方法跟插入数据时带 id 的使用方法一样,这样会将该 id 的对象修改
result = es.index(index="animal",doc_type="dog",id=1,body={'name':'大灰','age':15})
print(result)
打印结果为,此时的 _version 属性值变为 3 :
{'_index': 'animal', '_type': 'dog', '_id': '1', '_version': 3, 'result': 'updated', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 12, '_primary_term': 1}
删除文档对象:
使用 delete 方法删除单个文档对象,在这里我们删除 index = animal 且 type = dog ,id = 1 的文档对象,如果该对象不存在的话,该方法会抛异常(NotFoundError),返回 status 为 404 ,为了避免程序抛异常终止,在这里加上了 ignore=[400, 404]
result = es.delete(index="animal", doc_type="dog", id=1, ignore=[400, 404])
print(result)
打印结果为:
{'_index': 'animal', '_type': 'dog', '_id': '1', '_version': 4, 'result': 'deleted', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 13, '_primary_term': 1}
删除索引:
使用 es.indices.delete() 方法删除所有,注意,删除以后该索引下的所有内容都会丢失
result = es.indices.delete(index="animal",ignore=[400,404])
print(result)
打印结果为:
{'acknowledged': True}
这些是python中对elasticsearch最基本的操作,还有超多高级的操作,可以参考官方文档学习:
https://elasticsearch-py.readthedocs.io/en/master/#python-elasticsearch-client