Python操作搜索引擎Elasticsearch

requests elasticsearch 2016年09月30日 星期五

Elasticsearch是由java写的,提供了很友好的restful风格的api进行CURD数据。

官方也有python的包,其是对ES的API友好的请求封装,能够用pythonic的方式去操作ES。

其中涉及到script进行操作数据的修改的部分,需要修改ES的配置文件config/elasticsearch.yml,然后增加两行配置,启用script。

script.inline: true
script.indexed: true

对于ES集群,则很简单的一样的启动方式,再启动一个实例就好,ES会自己处理。

下面贴出关于这次python进行本机实验的代码。

# -*-coding:utf-8 -*-
# create at 2016-09-22
# 

__author__ = 'rory'

import json
import requests

from elasticsearch import Elasticsearch

# 创建ES客户端, 同台机器直接同样启动即可, 会自动做集群处理
# es = Elasticsearch([{'host': '127.0.0.1', 'port': '9200'},
#                     {'host': '127.0.0.1', 'port': '9201'},
#                     {'host': '127.0.0.1', 'port': '9202'}])

# 插入初始化数据
# i = 1
# r = requests.get('http://localhost:9200')
# while r.status_code == 200:
#     r = requests.get('http://swapi.co/api/people/' + str(i))
#     es.index(index='sw', doc_type='people', id=i, body=json.loads(r.content))
#     i += 1
# print(i)

# 直接通过id获取,找不到会有异常抛出 code=404 | 只显示其中某些字段 | 不显示_source | 只获取_source | 是否存在
# print es.get(index='sw', doc_type='people', id=18)
# print es.get(index='sw', doc_type='people', id=18, _source=['name'])
# print es.get(index='sw', doc_type='people', id=18, _source=False)
# print es.get_source(index='sw', doc_type='people', id=17)
# print es.exists(index='sw', doc_type='people', id=17)

# 通过传入ID新建 & 全局修改数据、_version 会自动增加、通过version去控制修改 | 局部更新 | 通过脚本(参数)进行修改
# print es.index(index='sw', doc_type='people', id=17, body=json.dumps({u'starships': [u'http://swapi.co/api/starships/12/'], u'edited': u'2014-12-20T21:17:50.341000Z', u'name': u'贾贾贾中', u'age': 19, u'created': u'2014-12-12T11:08:06.469000Z', u'url': u'http://swapi.co/api/people/18/', u'gender': u'male', u'vehicles': [u'http://swapi.co/api/vehicles/14/'], u'skin_color': u'fair', u'hair_color': u'brown', u'height': u'177', u'eye_color': u'hazel', u'mass': u'90', u'films': [u'http://swapi.co/api/films/3/', u'http://swapi.co/api/films/2/', u'http://swapi.co/api/films/1/'], u'species': [u'http://swapi.co/api/species/1/'], u'homeworld': u'http://swapi.co/api/planets/22/', u'birth_year': u'21BBY'}))
# print es.update(index='sw', doc_type='people', id=17, body={'doc': {'name': u'嘉嘉'}})
# print es.update(index='sw', doc_type='people', id=17, body={'script': 'ctx._source.age+=1'})
# print es.update(index='sw', doc_type='people', id=17, body={'script': 'ctx._source.age+=count', 'params': {'count': 3}})

# 检索多个文档、未知ID会告知
# print es.mget(body={'ids': [17, 18, 100]}, index='sw', doc_type='people')

# 通过传入ID删除数据
# print es.delete(index='sw', doc_type='people', id=17)

# 通过字段分词直接匹配
# print es.search(index='sw', doc_type='people', body={'query': {'match': {'name': 'Darth Vader'}}})

# 通过短语整个匹配
# print es.search(index='sw', doc_type='people', body={'query': {'match_phrase': {'name': 'Darth Vader'}}})

# 通过前缀匹配
# print es.search(index='sw', doc_type='people', body={'query': {'prefix': {'name': 'lu'}}})

# 高亮查询的字段
# print es.search(index='sw', doc_type='people', body={'query': {'match_phrase': {'name': 'Darth Vader'}}, 'highlight': {'fields': {'name': {}}}})

# 只返回hits下面的某些字段 .. filter_path 参数
# print es.search(index='sw', doc_type='people', body={'query': {'prefix': {'name': 'lu'}}}, filter_path=['hits.hits._*'])
# print es.search(index='sw', doc_type='people', body={'query': {'prefix': {'name': 'lu'}}}, filter_path=['hits.hits._id', 'hits.hits._type'])

# 聚合查询 -- 类似SQL Group By | count / avg / max
# print es.search(index='sw', doc_type='people', body={'aggs': {'sex': {'terms': {'field': 'gender'}}}}, filter_path=['aggregations'])
# print es.search(index='sw', doc_type='people', body={'aggs': {'sex': {'terms': {'field': 'gender'}, 'aggs': {'avg_age': {'avg': {'field': 'mass'}}}}}}, filter_path=['aggregations'])

# 查询汉字
# print es.search(index='sw', doc_type='people', body={'query': {'match': {'name': u'贾 王'}}}, filter_path=['hits.hits'])

参考【ElasticSearch权威指南】,中文版,讲述ES知识点很详细。