在 Python 中使用 Elasticsearch

《在 Python 中使用 Elasticsearch》

在这篇文章中,我将讨论 Elasticsearch 以及如何将其整合到不同的 Python 应用程序中。

什么是 ElasticSearch?

ElasticSearch(ES)是一个建立在 Apache Lucene 之上的高度可用的分布式开源搜索引擎。它基于 Java 构建的,因此可用于许多平台。数据以 JSON 格式非结构化存储,这也使其成为一种 NoSQL 数据库。与其他 NoSQL 数据库不同,ES 还提供搜索引擎功能和其他相关功能。

ElasticSearch 用例

ES 可用于多种目的,下面给出了其中的几个:

你运营着提供大量动态内容的网站,比如电子商务网站或者博客。通过实施ES,你不仅可以为Web应用程序提供强大的搜索引擎,还可以在应用程序中提供原生自动补全功能。

你可以获取不同类型的日志数据,然后可以使用它来查找趋势和统计信息。

设置和运行

安装 ElasticSearch 最简单的方法就是下载并运行可执行文件。必须确保使用的是 Java 7 或更高版本。

下载后解压缩并运行它的二进制文件。

滚动窗口中会出现很多文字。如果你看到像下面这样的,那么它应该是完成了。

但是,由于眼见为实,可以在浏览器中访问 URLhttp://localhost:9200 或者通过 cURL 查看类似于这样的欢迎界面以便你知道确实成功安装了:

《在 Python 中使用 Elasticsearch》

在我开始访问 Python 中的 Elastic Search 之前,我们来做一些基本的东西。 正如我提到ES提供了一个 REST API 接口,我们将使用它来执行不同的任务。

基本示例

你要做的第一件事就是创建索引。一切都以索引形式存储。RDBMS 概念中索引相当于一个数据库,因此不要将它与你在 RDBMS 中学习的典型索引概念混淆。使用 PostMan 来运行 REST API。如果它成功运行,你会看到如下所示的回应:

《在 Python 中使用 Elasticsearch》

所以我们使用company为名创建了一个数据库。换句话说,我们创建了一个名为“company”的索引。如果你从浏览器访问 http://localhost:9200/company,那么你将看到如下所示的内容:

《在 Python 中使用 Elasticsearch》

暂时不用管 mappings 是什么,我们会在后面讨论它。它实际上做的只是创建一个你自己的 Schema 文档。creation_date 是不言自明的。number_of_shards 表示将保留此索引数据的分区数量。将整个数据保存在单个磁盘上毫无意义。如果你运行的是多个 Elastic 节点的集群,那么整个数据都会被分割。简而言之,如果有 5 个分片,则整个数据可以在 5 个分片中使用,并且 ElasticSearch 集群可以服务来自其任何节点的请求。

副本讨论的是你的数据的镜像。如果你熟悉主从概念,那么这对你来说不应该是新事物。你可以了解更多关于基本 ES 概念。

创建索引的 cURL 版本是单线程的。

你也可以一次执行索引创建和记录插入任务。你所要做的就是以 JSON 格式传递你的记录。你可以在 PostMan 中使用下面的东西:

《在 Python 中使用 Elasticsearch》

请确保你将 Content-Type 设置为 application/json.

一个名为 company 的索引会被创建如果它原本不存在的话,然后在这里创建一个名为 employees 的新类型。Type 实际上是 RDBMS 中的表的 ES 版本。

上述请求将输出以下 JSON 结构:

《在 Python 中使用 Elasticsearch》

你传递 /1 作为你的记录的 ID,但这是不必要的。它所做的只是将 _id 字段设置为值 1,然后数据以 JSON 格式传递,最终作为新记录或文档插入。如果你从浏览器访问 http://localhost:9200/company/employees/1,你会看到如下所示的内容:

你可以看到元和实际记录。 如果你想,可以将请求更改为http://localhost:9200/company/employees/1/_source,那么就会仅输出 JSON 结构记录。

cURL 版本将是:

如果你想更新该记录怎么办?这很简单。你所要做的就是改变你的 JSON 记录。如下所示:

《在 Python 中使用 Elasticsearch》

它会生成以下输出:

《在 Python 中使用 Elasticsearch》

注意现在 _result 字段设置为 updated 而不是 created 。

当然,你也可以删除某些记录。

《在 Python 中使用 Elasticsearch》

如果你疯了,或者你的女朋友甩了你,你可以通过从命令行运行curl -XDELETE localhost:9200/_all来毁掉整个世界。让我们做一些基本的搜索。 如果运行http://localhost:9200/company/employees/_search?q=adnan,它将搜索 employees 类型下的所有字段并返回相关记录。

《在 Python 中使用 Elasticsearch》

max_score 字段表示记录的相关性,即记录的最高分数。如果有多个记录,那么它会是一个不同的数字。

你还可以通过传递字段名称将搜索条件限制到某个字段。因此,http://localhost:9200/company/employees/_search?q=name:Adnan将仅在文档的名称字段中进行搜索。它实际上等同于SQL中的SELECT * from table where name=”Adnan”。

我刚刚介绍了基本的例子。ES 可以做很多事情,但是希望你自己通过阅读文档来进一步探索它,而我将继续介绍在 Python 中使用 ES。

在 Python 中使用 ElasticSearch

说实话,ES 的 REST API 已经足够好了,可以让你使用 requests 库执行所有任务。不过,你可以使用 ElasticSearch 的 Python 库专注于主要任务,而不必担心如何创建请求。

通过 pip 安装它,然后你可以在你的 Python 程序中访问它。

为确保它的安装正确,请从命令行运行以下基本片段:

网页搜索和 Elasticsearch

我们来讨论一下使用 Elasticsearch 的一些实际用例。我们的目标是访问在线食谱并将它们存储在 Elasticsearch 中以用于搜索和分析。我们将首先从 Allrecipes 中获取数据并将其存储在 ES 中。我们还将创建一个严格的模式或映射,以便我们确保数据以正确的格式和类型进行索引。最后只要列出沙拉食谱的清单。我们开始吧!

获取数据

《在 Python 中使用 Elasticsearch》
《在 Python 中使用 Elasticsearch》

所以这是获取数据的基本程序。因为我们需要 JSON 格式的数据,所以我对其进行了相应的转换。

创建索引

我们得到了所需的数据,接下来我们必须存储它。我们要做的第一件事就是创建一个索引。让我们将其命名为 recipes。 该类型将被称为 salads。我要做的另一件事是创建我们的文档结构的映射。

在我们创建索引之前,我们必须连接ElasticSearch服务器。

《在 Python 中使用 Elasticsearch》

_es.ping() 会 ping 服务器,并在连接后返回 True。我花了一段时间才弄清楚如何捕获堆栈跟踪,发现它只是被记录下来!

《在 Python 中使用 Elasticsearch》

这里有很多要说的事。首先,我们传递了一个包含整个文档结构映射的配置变量。映射是模式这一术语在 Elastic 的版本。就像我们在表格中设置特定的字段数据类型一样,我们在这里做类似的事情。检查文档,它涵盖的不仅仅是这些。所有字段都是文本类型,但是 calories 类型为 Integer。

接下来,我确保索引不存在,然后创建它。参数 ignore = 400 在检查后不再需要,但存在性证明是必要的,因为这可以防止错误地覆盖现有索引。虽然这很危险。这就像覆盖数据库。

如果索引成功创建,你可以通过访问 http://localhost:9200/recipes/_mappings 来验证它,它会输出如下所示的内容:

《在 Python 中使用 Elasticsearch》

通过传递 dynamic:strict 我们使 Elasticsearch 严格检查任何传入的文档。在这里,salads 实际上是文档类型。Type 实际上是 Elasticsearch 对 RDBMS 表的回答。

记录索引

下一步是存储实际的数据或文档。

运行它,你会看到:

你能猜到为什么会这样吗?由于我们没有在我们的映射中设置 ingredients,因此 ES 不允许我们存储包含 ingredients 字段的文档。现在你知道事先分配映射的优势了。你可以通过这样做避免破坏数据。现在,让我们稍微修改一下映射,现在看起来如下所示:

《在 Python 中使用 Elasticsearch》

我们添加 nested 类型的 ingrdients,然后分配内部字段的数据类型,即在我们的案例中的 text。

nested 数据类型允许设置嵌套的 JSON 对象的类型。再次运行它,你将看到以下输出:

《在 Python 中使用 Elasticsearch》

由于你根本没有传递 _id,因此 ES 本身为存储的文档分配了一个动态 ID。 我使用Chrome,借助名为 ElasticSearch Toolbox 的工具使用 ES 数据查看器来查看数据。

《在 Python 中使用 Elasticsearch》

在我们继续之前,让我们在 calories 字段中发送一个字符串,看看它是如何发生的。请记住,我们已将其设置为整数。 在编制索引时出现以下错误:所以现在你知道为文档分配一个映射的好处了。如果你不这样做,它仍然会工作,因为 Elasticsearch 将在运行时分配它自己的映射。

查询记录

现在,记录被编入索引,是时候根据我们的需要查询它们了。我将创建一个名为 search() 的函数,它将显示我们的查询结果。

这是非常基本的。 你在其中传递索引和搜索条件。让我们尝试一些查询。

上述查询将返回卡路里等于 102 的所有记录。在我们的情况下,输出将是:

《在 Python 中使用 Elasticsearch》

如果你想获得卡路里超过 20 的记录怎么办?

你也可以指定想要返回的列或字段。上述查询将返回卡路里大于 20 的所有记录。此外,它将仅在 _source 下显示 title 字段。

结论

Elasticsearch 是一个功能强大的工具,它可以提供强大的功能帮助你来返回最准确的结果集,从而使你现有的或新的应用程序可搜索。我刚刚讲述了它的要点,你可以继续阅读文档并熟悉这个强大的工具。尤其是模糊搜索功能非常棒。如果我有机会,我会在即将发布的帖子中介绍 Query DSL。

英文原文:http://blog.adnansiddiqi.me/getting-started-with-elasticsearch-in-python/

译者:β

公告通知

Python实战班、自动化运维班、区块链正在招生中

各位小伙伴们,欢迎试听和咨询:

《在 Python 中使用 Elasticsearch》

    原文作者:51reboot
    原文地址: https://www.jianshu.com/p/29dbcb4bfb0e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞