Elasticsearch DSL是一个高级Python库,用于与Elasticsearch交互。它提供了更Pythonic的方式来构建查询和管理索引,相比直接使用Elasticsearch的低级客户端更加简洁和强大。
使用Python类和方法代替复杂的JSON查询,提高代码可读性和可维护性。
像操作Django ORM一样管理Elasticsearch文档和映射,大幅简化开发流程。
支持链式调用构建复杂查询,自动处理序列化和反序列化。
简化聚合查询的创建和执行,轻松实现数据分析功能。
开始使用Elasticsearch DSL之前,需要安装必要的库并建立连接:
使用pip安装elasticsearch和elasticsearch-dsl:
Python
pip install elasticsearch elasticsearch-dsl建立与Elasticsearch集群的连接:
Python
from elasticsearch import Elasticsearch
from elasticsearch_dsl import connections
# 创建默认连接
connections.create_connection(hosts=['localhost:9200'])
# 或者使用Elasticsearch客户端
es = Elasticsearch(['localhost:9200'])使用Document类定义索引结构和字段类型:
Python
from elasticsearch_dsl import Document, Text, Keyword, Date, Integer
class Article(Document):
title = Text(analyzer='snowball', fields={'raw': Keyword()})
author = Keyword()
content = Text(analyzer='snowball')
published_at = Date()
tags = Keyword(multi=True)
views = Integer()
class Index:
name = 'blog'
settings = {
"number_of_shards": 2,
"number_of_replicas": 1
}
http://inanxing.com
http://lyfezx.com
提示: 使用Document类可以自动处理索引创建、文档映射和序列化/反序列化。
# 创建索引(如果不存在)
Article.init()article = Article(
title='Python Elasticsearch DSL教程',
author='张三',
content='本教程将教你如何使用Elasticsearch DSL库...',
published_at='2023-06-15',
tags=['python', 'elasticsearch', '教程'],
views=1500
)
# 保存文档到Elasticsearch
article.save()from elasticsearch.helpers import bulk
from elasticsearch_dsl import Index
# 批量导入文档
articles = [
Article(title=f"文章 {i}", author=f"作者 {i%5}")
for i in range(100)
]
for a in articles:
a.save()http://szmtp.com ,http://hlkjfj.com
from elasticsearch_dsl import Search
# 创建Search对象
s = Search(index='blog')
# 查询所有文档
response = s.execute()
for hit in response:
print(hit.title)from elasticsearch_dsl import Q
# 创建多条件查询
s = Search(index='blog').query(
Q('match', title='python') |
Q('match', content='elasticsearch')
).filter('range', views={'gte': 100})
# 分页设置
s = s[0:10]
# 执行查询
response = s.execute()from elasticsearch_dsl import A
# 按作者聚合文章数量
s = Search(index='blog')
a = A('terms', field='author.keyword', size=5)
s.aggs.bucket('authors', a)
response = s.execute()
# 打印聚合结果
for author in response.aggregations.authors.buckets:
print(f"{author.key}: {author.doc_count}篇文章")# 获取文档
article = Article.get(id='some_id')
# 更新字段
article.views += 1
article.save()# 删除单个文档
article = Article.get(id='some_id')
article.delete()
# 按查询删除
s = Search(index='blog').query('match', author='张三')
s.delete()性能提示: 对于大数据量查询,使用scan()代替execute()可以避免深度分页问题。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。