Fork me on GitHub

Learning Elasticsearch (i)

本文以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

  • 查改

    1. 删除指定id的文档:es.delete(school='school', doc_type='teacher', id=id)
    2. 删除查询到的文档:es.delete_by_query(school='school', doc_type='teacher', body=query_body)
  • 增删

    这里仅介绍通过id获取文档的方法:es.get(school='school', doc_type='teacher', id=id)
    关于复杂又强大的查询方式,将有相应篇幅介绍!

  • 增删查
    同删除接口类似,修改某个文档接口也分为指定id和查询修改两类:

    1. 修改指定id的文档:es.update(school='school', doc_type='teacher', id=id, body=update_body)
    2. 修改查询到的文档:es.update_by_query(school='school', doc_type='teacher', body=query_and_update_body)

示例:

下面给出一个示例,数据生成程序位于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字段即获取到的文档实体。

联系我:houlu8674@bupt.edu.cn

links

social