使用Python操作Elasticsearch数据索引的教程

  • Post category:Python

下面是使用Python操作Elasticsearch数据索引的完整攻略。

环境准备

在进行操作前,需要安装好以下两个组件:

  1. Python-elasticsearch 客户端库:它提供了 Python 与 Elasticsearch 直接的交互通道
  2. 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 如何存储日期字段。