下面是使用Python操作Elasticsearch数据索引的完整攻略。
环境准备
在进行操作前,需要安装好以下两个组件:
- Python-elasticsearch 客户端库:它提供了 Python 与 Elasticsearch 直接的交互通道
- Elasticsearch 服务器:至少启动一个 Elasticsearch 节点,作为数据存储和管理的中心节点。
创建索引
首先,我们需要创建一个索引,以存储数据。运行以下代码即可:
from elasticsearch import Elasticsearch
es = Elasticsearch()
mapping = {
"mappings": {
"properties": {
"title": {"type": "text"},
"content": {"type": "text"},
"timestamp": {"type": "date"}
}
}
}
es.indices.create(index="my_index", body=mapping)
上述代码创建了一个名为 “my_index” 的索引,并定义了三个字段:title、content 和 timestamp。类型分别为 “text”、”text” 和 “date”。
插入数据
接下来,我们需要向刚创建的索引中插入数据。运行以下代码即可插入一条数据:
from datetime import datetime
doc = {
"title": "Elasticsearch Introduction",
"content": "Elasticsearch is a search engine based on Lucene",
"timestamp": datetime.now()
}
res = es.index(index="my_index", id=1, body=doc)
print(res['result'])
上述代码创建了一个名为 “doc” 的字典,表示一个数据文档,包含三个字段:title、content 和 timestamp。使用 es.index()
将这条数据插入到 “my_index” 索引中,id 设置为 1。
查询数据
插入了数据后,我们需要从 Elasticsearch 中检索数据。运行以下代码即可查询全部数据:
res = es.search(index="my_index", body={"query": {"match_all": {}}})
print("Got %d Hits:" % res['hits']['total']['value'])
for hit in res['hits']['hits']:
print("%(timestamp)s %(title)s: %(content)s" % hit["_source"])
上述代码使用 es.search()
查询 “my_index” 索引中所有数据,并在控制台输出数据的 timestamp、title 和 content 字段。
示例说明
示例一
我们将上述三步操作封装到一个函数中,方便使用。执行以下代码:
from datetime import datetime
from elasticsearch import Elasticsearch
es = Elasticsearch()
def create_index(index_name):
mapping = {
"mappings": {
"properties": {
"title": {"type": "text"},
"content": {"type": "text"},
"timestamp": {"type": "date"}
}
}
}
es.indices.create(index=index_name, body=mapping)
def insert_data(index_name, doc_id, doc):
res = es.index(index=index_name, id=doc_id, body=doc)
print(res['result'])
def search_data(index_name):
res = es.search(index=index_name, body={"query": {"match_all": {}}})
print("Got %d Hits:" % res['hits']['total']['value'])
for hit in res['hits']['hits']:
print("%(timestamp)s %(title)s: %(content)s" % hit["_source"])
if __name__ == '__main__':
index_name = "my_index"
create_index(index_name)
doc = {
"title": "Elasticsearch Introduction",
"content": "Elasticsearch is a search engine based on Lucene",
"timestamp": datetime.now()
}
insert_data(index_name, 1, doc)
search_data(index_name)
这个 Python 脚本定义了三个函数 create_index()
、insert_data()
和 search_data()
分别对应了上述三个步骤。本例操作了 “my_index” 索引,而且在插入数据时指定了数据文档 id,为 1。运行以上代码,可得到以下输出结果:
created
created
Got 1 Hits:
2022-05-18T17:49:30.288581 Elasticsearch Introduction: Elasticsearch is a search engine based on Lucene
示例二
我们尝试向文档中添加一些字段,并根据新字段进行查询。执行以下代码:
from datetime import datetime
from elasticsearch import Elasticsearch
es = Elasticsearch()
def create_index(index_name):
mapping = {
"mappings": {
"properties": {
"title": {"type": "text"},
"content": {"type": "text"},
"timestamp": {"type": "date"},
"year": {"type": "integer"},
"month": {"type": "integer"},
"day": {"type": "integer"}
}
}
}
es.indices.create(index=index_name, body=mapping)
def insert_data(index_name, doc_id, doc):
res = es.index(index=index_name, id=doc_id, body=doc)
print(res['result'])
def search_data(index_name, year, month):
query = {"query": {"bool": {"must": [
{"match_all": {}},
{"match": {"year": year}},
{"match": {"month": month}}
]}}}
res = es.search(index=index_name, body=query)
print("Got %d Hits:" % res['hits']['total']['value'])
for hit in res['hits']['hits']:
print("%(timestamp)s %(title)s: %(content)s" % hit["_source"])
if __name__ == '__main__':
index_name = "my_index"
create_index(index_name)
doc = {
"title": "Elasticsearch Introduction",
"content": "Elasticsearch is a search engine based on Lucene",
"timestamp": datetime.now(),
"year": 2022,
"month": 5,
"day": 18
}
insert_data(index_name, 1, doc)
search_data(index_name, 2022, 5)
运行以上代码,可得到以下输出结果:
created
created
Got 1 Hits:
2022-05-18T18:31:01.041669 Elasticsearch Introduction: Elasticsearch is a search engine based on Lucene
这个 Python 脚本对示例一中的代码做了一点修改。定义了三个新字段:year、month 和 day。插入文档时,我们为新字段指定了大于 0 的整数值。执行 search_data()
函数时,我们添加了两个新条件:year 和 month,用于过滤查询结果。这个示例说明了如何对文档进行多字段查询,以及 Elasticsearch 如何存储日期字段。