本文以Elasticsearch的Python(人生苦短)客户端为例,一起来感受Elasticsearch(Python)的强大之处。
推荐Python版本:3.6
官方文档:https://elasticsearch-py.readthedocs.io/en/master/ 请移步这里查看本文代码示例
Elasticsearch Python Client安装
pip install elasticsearch
ik分词器
Elasticsearch内置多种类型分词器,但均不支持中文。因而本文选取ik分词器做为中文分词工具 ik-analyzer: https://github.com/medcl/elasticsearch-analysis-ik
Client类
想要使用elasticsearch面向document的各个接口,需要先构建一个Elasticsearch
实例:
import elasticsearch
es = elasticsearch.Elasticsearch(host=xxx, port=9200)
该es
用于使用面向document的接口。其他接口(如索引index相关接口)需要实例化es
的一些子类。
es子类
为了操作Elasticsearch的索引,我们需要初始化一个es的子类实例:
indices = elasticsearch.client.IndicesClient(es)
此后,我们可以使用indices
进行索引级的各种操作
建立index
利用indices
实例可以建立新的索引:
res = indices.create(index='school', body=ind_mappings)
body
参数会在后续介绍。可以将res
打印,查看是否建立成功。
基本操作:
-
增删查改
增加一个文档:
es.create(index='school', doc_type='teacher', id=id, body=obj_doc)
,将会在索引school
下的teacher
类型中增加一个id
为id(整型)的文档,内容为obj_doc
。 -
增删查改
- 删除指定id的文档:
es.delete(school='school', doc_type='teacher', id=id)
- 删除查询到的文档:
es.delete_by_query(school='school', doc_type='teacher', body=query_body)
- 删除指定id的文档:
-
增删查改
这里仅介绍通过id获取文档的方法:
es.get(school='school', doc_type='teacher', id=id)
关于复杂又强大的查询方式,将有相应篇幅介绍! -
增删查改
同删除接口类似,修改某个文档接口也分为指定id和查询修改两类:- 修改指定id的文档:
es.update(school='school', doc_type='teacher', id=id, body=update_body)
- 修改查询到的文档:
es.update_by_query(school='school', doc_type='teacher', body=query_and_update_body)
- 修改指定id的文档:
示例:
下面给出一个示例,数据生成程序位于example
目录下的generate_ex_data.py
文件。假设JSON数据存于文件data.json
中:
import json
import elasticsearch
from pprint import pprint
#Instantiation
es = elasticsearch.Elastic(host='localhost')
indices = elasticsearch.client.IndicesClient(es)
#create index
indices.create(index='school')
#read JSON data from file
with open('data.json', 'r') as f:
teachers = json.load(f)
#create documents
for ind, val in enumerate(teachers):
try:
res = es.create(index='school', doc_type='teacher', id=ind, body=val)
except:
print('Create No. {} doc ERROR!'.format(ind))
尝试get
一个文档:
res = es.get(index='school', doc_type='teacher', id=5)
pprint(res)
可以看到结果如下:
{
'_id': '5',
'_index': 'school',
'_source': {'age': 28,
'introduction': '这位是吴芳教师,职称:助教,年龄:28',
'name': '吴芳',
't_id': '5530eac6a8075110c87a67bf6caa8142',
'title': '助教'},
'_type': 'teacher',
'_version': 1,
'found': True
}
其中_source
字段即获取到的文档实体。