ElasticSearch之-python操作
Python中关于elasticsearch的操作,主要集中一下几个方面:
-
结果过滤,对于返回结果做过滤,主要是优化返回内容。
-
Elasticsearch(简称es),直接操作elasticsearch对象,处理一些简单的索引信息。以下几个方面都是建立在es对象的基础上。
-
Indices,关于索引的细节操作,比如创建自定义的
mappings
。 -
Cluster,关于集群的相关操作。
-
Nodes,关于节点的相关操作。
-
Cat API,换一种查询方式,一般的返回都是json类型的,cat提供了简洁的返回结果。
-
-
Task Management API,任务管理API是新的,仍应被视为测试版功能。API可能以不向后兼容的方式更改。
# print(es.index(index='w2', doc_type='_doc', id='4', body={"name":"可可", "age": 18})) # 正常
# print(es.index(index='w2', doc_type='_doc', id=5, body={"name":"卡卡西", "age":22})) # 正常
# print(es.index(index='w2', id=6, body={"name": "鸣人", "age": 22})) # 会报错,TypeError: index() missing 1 required positional argument: 'doc_type'
print(es.index(index='w2', doc_type='doc', body={"name": "鸣人", "age": 22})) # 可以不指定id,默认生成一个id
print(es.get(index='w2', doc_type='doc', id=5)) # 正常
print(es.get(index='w2', doc_type='doc')) # TypeError: get() missing 1 required positional argument: 'id'
print(es.get(index='w2', id=5)) # TypeError: get() missing 1 required positional argument: 'doc_type'
-
-
index
要搜索的以逗号分隔的索引名称列表; 使用_all 或空字符串对所有索引执行操作。 -
doc_type
要搜索的以逗号分隔的文档类型列表; 留空以对所有类型执行操作。 -
body
使用Query DSL(QueryDomain Specific Language查询表达式)的搜索定义。 -
_source
返回_source
字段的true或false,或返回的字段列表,返回指定字段。 -
_source_exclude
要从返回的_source
字段中排除的字段列表,返回的所有字段中,排除哪些字段。 -
_source_include
从_source
字段中提取和返回的字段列表,跟_source
-
print(es.search(index='py3', doc_type='doc', body={"query": {"match":{"age": 20}}})) # 一般查询
print(es.search(index='py3', doc_type='doc', body={"query": {"match":{"age": 19}}},_source=['name', 'age'])) # 结果字段过滤
print(es.search(index='py3', doc_type='doc', body={"query": {"match":{"age": 19}}},_source_exclude =[ 'age']))
print(es.search(index='py3', doc_type='doc', body={"query": {"match":{"age": 19}}},_source_include =[ 'age']))
es.get_source,通过索引、类型和ID获取文档的来源,其实,直接返回想要的字典。
print(es.get_source(index='py3', doc_type='doc', id='1')) # {'name': '王五', 'age': 19}
body = {
"query": {
"match": {
"age": 18
}
}
}
print(es.count(index='py2', doc_type='doc', body=body)) # {'count': 1, '_shards': {'total': 5, 'successful': 5, 'skipped': 0, 'failed': 0}}
print(es.count(index='py2', doc_type='doc', body=body)['count']) # 1
print(es.count(index='w2')) # {'count': 6, '_shards': {'total': 5, 'successful': 5, 'skipped': 0, 'failed': 0}}
print(es.count(index='w2', doc_type='doc')) # {'count': 6, '_shards': {'total': 5, 'successful': 5, 'skipped': 0, 'failed': 0}}
print(es.create(index='py3', doc_type='doc', id='1', body={"name": '王五', "age": 20}))
print(es.get(index='py3', doc_type='doc', id='3'))
在内部,调用了index,等价于:
print(es.index(index='py3', doc_type='doc', id='4', body={"name": "麻子", "age": 21}))
-
es.delete,删除指定的文档。比如删除文章id为
4
的文档,但不能删除索引,如果想要删除索引,还需要es.indices.delete来处理
print(es.delete(index='py3', doc_type='doc', id='4'))
-
-
index
要搜索的以逗号分隔的索引名称列表; 使用_all 或空字符串对所有索引执行操作。 -
doc_type
要搜索的以逗号分隔的文档类型列表; 留空以对所有类型执行操作。 -
body
-
print(es.delete_by_query(index='py3', doc_type='doc', body={"query": {"match":{"age": 20}}}))
print(es.exists(index='py3', doc_type='doc', id='1'))
print(es.info())
print(es.ping())
-
比如创建一个严格模式、有4个字段、并为
title
字段指定ik_max_word
查询粒度的mappings
。并应用到py4
body = {
"mappings": {
"doc": {
"dynamic": "strict",
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"url": {
"type": "text"
},
"action_type": {
"type": "text"
},
"content": {
"type": "text"
}
}
}
}
}
es.indices.create('py4', body=body)
es.indices.analyze(body={'analyzer': "ik_max_word", "text": "皮特和茱丽当选“年度模范情侣”Brad Pitt and Angelina Jolie"})
print(es.indices.delete(index='py4'))
print(es.indices.delete(index='w3')) # {'acknowledged': True}
-
-
index
别名应指向的逗号分隔的索引名称列表(支持通配符),使用_all对所有索引执行操作。 -
name
要创建或更新的别名的名称。 -
body
-
print(es.indices.put_alias(index='py4', name='py4_alias')) # 为单个索引创建别名
print(es.indices.put_alias(index=['py3', 'py2'], name='py23_alias')) # 为多个索引创建同一个别名,联查用
print(es.indices.delete_alias(index='alias1'))
print(es.indices.delete_alias(index=['alias1, alias2']))
print(es.indices.get_mapping(index='py4'))
print(es.indices.get_settings(index='py4'))
print(es.indices.get(index='py2')) # 查询指定索引是否存在
print(es.indices.get(index=['py2', 'py3']))
print(es.indices.get_alias(index='py2'))
print(es.indices.get_alias(index=['py2', 'py3']))
print(es.indices.get_field_mapping(fields='url', index='py4', doc_type='doc'))
print(es.indices.get_field_mapping(fields=['url', 'title'], index='py4', doc_type='doc'))
-
-
es.indices.exists,返回一个布尔值,指示给定的索引是否存在。
-
es.indices.exists_type,检查索引/索引中是否存在类型/类型。
-
es.indices.flus,明确的刷新一个或多个索引。
-
es.indices.get_field_mapping,检索特定字段的映射。
-
es.indices.get_template,按名称检索索引模板。
-
es.indices.open,打开一个封闭的索引以使其可用于搜索。
-
es.indices.close,关闭索引以从群集中删除它的开销。封闭索引被阻止进行读/写操作。
-
es.indices.clear_cache,清除与一个或多个索引关联的所有缓存或特定缓存。
-
es.indices.put_alias,为特定索引/索引创建别名。
-
es.indices.get_uprade,监控一个或多个索引的升级程度。
-
es.indices.put_mapping,注册特定类型的特定映射定义。
-
es.indices.put_settings,实时更改特定索引级别设置。
-
es.indices.put_template,创建一个索引模板,该模板将自动应用于创建的新索引。
-
es.indices.rollove,当现有索引被认为太大或太旧时,翻转索引API将别名转移到新索引。API接受单个别名和条件列表。别名必须仅指向单个索引。如果索引满足指定条件,则创建新索引并切换别名以指向新别名。
-
print(es.cluster.get_settings())
print(es.cluster.health())
print(es.cluster.state())
print(es.cluster.stats())
print(es.nodes.info()) # 返回所节点
print(es.nodes.info(node_id='node1')) # 指定一个节点
print(es.nodes.info(node_id=['node1', 'node2'])) # 指定多个节点列表
print(es.nodes.stats())
print(es.nodes.stats(node_id='node1'))
print(es.nodes.stats(node_id=['node1', 'node2']))
print(es.nodes.hot_threads(node_id='node1'))
print(es.nodes.hot_threads(node_id=['node1', 'node2']))
print(es.nodes.usage())
print(es.nodes.usage(node_id='node1'))
print(es.nodes.usage(node_id=['node1', 'node2']))
-
-
name
要返回的以逗号分隔的别名列表。 -
format
-
print(es.cat.aliases(name='py23_alias'))
print(es.cat.aliases(name='py23_alias', format='json'))
print(es.cat.allocation())
print(es.cat.allocation(node_id=['node1']))
print(es.cat.allocation(node_id=['node1', 'node2'], format='json'))
print(es.cat.count()) # 集群内的文档总数
print(es.cat.count(index='py3')) # 指定索引文档总数
print(es.cat.count(index=['py3', 'py2'], format='json')) # 返回两个索引文档和
-
es.cat.fielddata
print(es.cat.fielddata())
print(es.cat.fielddata(format='json', bytes='b'))
-
health
print(es.cat.health())
print(es.cat.health(format='json'))
-
es.cat
print(es.cat.help())
print(es.cat.indices())
print(es.cat.indices(index='py3'))
print(es.cat.indices(index='py3', format='json'))
print(len(es.cat.indices(format='json'))) # 查询集群中有多少索引
print(es.cat.master())
print(es.cat.master(format='json'))
print(es.cat.nodeattrs())
print(es.cat.nodeattrs(format='json'))
print(es.cat.nodes())
print(es.cat.nodes(format='json'))
print(es.cat.plugins())
print(es.cat.plugins(format='json'))
print(es.cat.segments())
print(es.cat.segments(index='py3'))
print(es.cat.segments(index='py3', format='json'))
print(es.cat.shards())
print(es.cat.shards(index='py3'))
print(es.cat.shards(index='py3', format='json'))
print(es.cat.thread_pool())
-
-
repository
存储库名称。 -
snapshot
快照名称。 -
body
快照定义。
-
-
es.snapshot.delete,从存储库中删除快照。
-
es.snapshot.create_repository。注册共享文件系统存储库。
-
es.snapshot.delete_repository,删除共享文件系统存储库。
-
es.snapshot.get,检索有关快照的信息。
-
es.snapshot.get_repository,返回有关已注册存储库的信息。
-
es.snapshot.restore,恢复快照。
-
es.snapshot.status,返回有关所有当前运行快照的信息。通过指定存储库名称,可以将结果限制为特定存储库。
-
-
-
es.tasks.cancel,取消任务。
-
print(es.search(index='py2', filter_path=['hits.total', 'hits.hits._source'])) # 可以省略type类型
print(es.search(index='w2', doc_type='doc')) # 可以指定type类型
print(es.search(index='w2', doc_type='doc', filter_path=['hits.total']))
print(es.search(index='py2', filter_path=['hits.*']))
print(es.search(index='py2', filter_path=['hits.hits._*']))
print(es.search(index='py2', filter_path=['hits.to*'])) # 仅返回响应数据的total
print(es.search(index='w2', doc_type='doc', filter_path=['hits.hits._*'])) # 可以加上可选的type类型
# Official low-level client for Elasticsearch 官方提供的低级别的模块
# 等同于pymysql,需要写原生的es查询语句
# pip3 install elasticsearch
from elasticsearch import Elasticsearch
es = Elasticsearch() # 得到一个对象
#1、创建索引(Index),一般创建索引不用代码去干
# 索引名user,body插入一条数据,ignore=400忽略400错误
result = es.indices.create(index='user', body{"userid":'1','username':'lqz'},ignore=400)
print(result)
#2、删除索引
result = es.indices.delete(index='user', ignore=[400, 404])
#3、插入数据,从mysql中查出数据,拼到data中,往es中导入数据
data = {'userid': '1', 'username': 'lqz','password':'123'}
result = es.create(index='news', doc_type='_doc', id=1, body=data) #没有索引会新建
print(result)
#4 更新数据,属于局部更新,即es增删改查中的post操作,而不是put操作
'''
不用doc包裹会报错
ActionRequestValidationException[Validation Failed: 1: script or doc is missing
'''
data ={'doc':{'userid': '1', 'username': 'lqz','password':'123ee','test':'test'}}
result = es.update(index='news', doc_type='_doc', body=data, id=1)
print(result)
#5 删除数据
result = es.delete(index='news', doc_type='_doc', id=1)
print(result)
#6 查询
#查找所有文档
query = {'query': {'match_all': {}}}
#查找名字叫做tilte中含有“十个”的所有文档
query = {'query': {'match': {'title': '十个'}}}
#查找年龄大于11的所有文档
query = {'query': {'range': {'age': {'gt': 11}}}}
allDoc = es.search(index='books', doc_type='_doc', body=query)
print(allDoc)
print(allDoc['hits']['hits'][0]['_source'])
# Elasticsearch DSL is a high-level 官方提供的更高级别的封装 模块
# pip3 install elasticsearch-dsl
from datetime import datetime
from elasticsearch_dsl import Document, Date, Nested, Boolean,analyzer, InnerDoc, Completion, Keyword, Text,Integer
from elasticsearch_dsl.connections import connections
connections.create_connection(hosts=["localhost"]) #连接
# 定义一个类,可以看做一个表模型
class Article(Document):
title = Text(analyzer='ik_max_word') # 用ik分词器
author = Text() # 用默认分词器
class Index:
name = 'myindex' # 索引名
def save(self, ** kwargs):
return super(Article, self).save(** kwargs)
if __name__ == '__main__':
# Article.init() # 创建索引
# 插入数据
article = Article()
article.title = "老男孩上海校区"
article.author = "lqz"
article.save() # 数据就保存了
#查询数据
s=Article.search()
s = s.filter('match', title="上海")
results = s.execute() # 执行
print(results) # 拿回一个对象,类型django ORM拿回的queryset对象
print(results[0].title)
#删除数据 先拿回数据再删除
s = Article.search()
s = s.filter('match', title="李清照").delete()
#修改数据 先拿回数据再修改
s = Article().search()
s = s.filter('match', title="上海")
results = s.execute()
print(results[0])
results[0].title="李清照阿斯顿发送到发送阿斯蒂"
results[0].save()