Django + Elasticsearch——搜索精彩的TED演讲
在本文中,我们将介绍Elasticsearch的基础知识: 它是什么,如何运行它,如何与它进行通信。
然后,在我们熟悉了Elasticsearch之后,我们将开始使用Django开发一个简单的web应用程序,它将使用Elasticsearch的强大功能。
运行Elasticsearch
在深入研究Elasticsearch的概念之前,我们应该先运行它。
当你开始在网上阅读关于Elasticsearch的文章时,你一定会偶然发现Elastic Stack这个词。Elastic Stack是由不同工具组成的生态系统:Kibana、Logstash、Beats和Elasticsearch本身。在本文中,我们将只使用Elasticsearch。
运行Elasticsearch最简单的方法是使用Docker。你只需要从DockerHub中获取一个镜像,并运行该容器,它就可以工作了:
如果你正确地执行了所有操作,你应该就可以向Elasticsearch发送HTTP请求:
我已经在这里使用了httpie库,以后还将使用它来发送HTTP请求。你可以使用httpie、curl或任何其他客户端来发送请求。这取决于你。
Elasticsearch 基本操作
Elasticsearch是一个搜索引擎。你应该考虑使用Elasticsearch来搜索数据,而不是使用像PostgreSQL或MySQL这样的常规SQL数据库的原因如下:
它运行的相当快;
它可以规模化;
它有很多很酷的组件,比如用于可视化数据的Kibana、用于收集和转换数据的Logstash等等。
与Elasticsearch的通信是通过RESTful API实现的。因此,所有操作都可以通过HTTP进行。如果你以前已经使用过RESTful API,那么通信对你来说应该很顺畅。
Elasticsearch是NoSQL数据库。它将数据存储为JSON文档,并且不会对数据施加严格的结构,这意味着你可以在JSON文档中放入任何你想要的内容。
这些JSON文档是在类型和索引中进行组织的。每个文档都属于一个类型。类型本身存在于索引中。每个索引只能包含一个类型。
我们可以将Elasticsearch存储数据的方式与其他关系型数据库存储数据的方式进行对比:
关系型数据库 → 数据库 → 表 → 行 → 列
Elasticsearch →索引 → 类型 → 文档 →字段
惟一的区别是在关系型数据库中,每个数据库可以有许多表。但是在Elasticsearch中,每个索引只能有一种类型。
Elasticsearch 请求
是时候开始动手了,我们来向Elasticsearch发出第一个请求:
在这个请求中,我们实际上做了很多事情:
创建了一个索引 tweets
创建了一个类型 doc
对一个包含有关一条推文信息的新文档进行了索引
现在我们来索引其他几个文档:
对所有文档的简单搜索如下:
但是我们现在所做的“搜索”是没有用的,因为它只返回了一个所有文档的列表。让我们进行一个真正的搜索,并试图找到特定作者的文档:
我们可以更进一步,让它变得更复杂。例如,让我们对文本字段进行全文搜索,并根据tweet拥有的点赞数量来对其进行筛选:
或者代替按“赞”来过滤推文,我们可以对其进行排序,并将最受欢迎的推文显示在第一个:
Django和 Elasticsearch 实战
现在,当你了解了Elasticsearch是什么以及如何使用它时,让我们用Django来创建一个简单的web应用程序,它将使用Elasticsearch的强大功能。
我们将尝试创建一个web应用程序,它将帮助我们搜索精彩的TED演讲。最终的结果是这样的:
首先,我们将下载关于TED演讲的原始数据,比如它们的名称、描述、文字记录等等。然后,我们将该数据插入到关系型数据库中,并将关系型数据库中的部分数据索引到Elasticsearch中。之后,我们将创建一个页面,该页面将与Elasticsearch进行交互,并根据用户在该页面上键入的搜索查询来显示最相关并且最流行的演讲。
设置项目
我们的项目将使用PostgreSQL(作为关系型数据库)、Elasticsearch和Django。设置一切的最简单方法是使用Docker。在一个容器中运行Elasticsearch之前,我们已经使用了Docker。现在我们有3个容器。一个用于PostgreSQL,一个用于Elasticsearch,还有一个用于Django web应用程序。
让我们从创建一个空项目开始:
添加 requirements.txt 文件:
并更新项目的设置文件:
现在,我们就可以配置Docker了。
让我们为我们的web应用程序创建一个Docker文件:
并添加start bash脚本,它将在我们启动一个带有web应用程序的容器之后开始执行:
正如我之前所说,我们将有3个容器,这些容器之间应该能够进行通信。例如,我们的web应用程序应该能够向PostgreSQL和Elasticsearch容器发送查询。运行多容器Docker应用程序的最佳工具是Docker Compose。通过Docker Compose,我们可以使用YAML文件来配置我们的应用程序的服务。它看起来是这样的:
在运行Docker Compose之前,我们应该创建.env文件。在这个文件中,我们将存储一些重要的环境变量:
现在我们可以开始了:
当这些容器准备好后,你应该就能打开主页了:
设置项目的最后一步是创建一个django应用程序:
并将其添加到已安装的应用程序列表中:
将数据插入关系型数据库
让我们创建一个模型:
并运行迁移:
现在,当我们有了数据库中的一个表和一个对这个表进行操作的模型,我们就应该用有关TED演讲的信息来填充该数据库。
我将从kaggle下载包含数据的csv文件,并使用pyexcel库处理这些文件。如果你要继续,请确保你将ted_main.csv和transcripts.csv文件复制到了你项目的根目录中。
处理CSV文件的脚本:
打开一个shell并运行我们刚刚编写的populate方法:
如果该脚本运行时没有出现任何错误,那你的数据库就应该填入了数据。
将数据索引到Elasticsearch
现在让我们来定义一个Elasticsearch索引和TalkDocument类:
这个类基本上用Elasticsearch连接我们的关系型数据库。为了创建一个索引talks,并将数据从该关系型数据库索引到Elasticsearch中,我们应该运行来自django_elasticsearch_dsl库的管理命令:
如果你现在尝试向Elasticsearch发出一个请求,你会看到和我们在关系型数据库中所拥有的数据相同的数据,除了url字段,因为我们没有索引它:
搜索演讲
让我们来创建一个搜索相关演讲的函数。它将分析名称、描述、演讲者和文字记录字段,并增加浏览量最高的演讲:
你可以在shell中使用这个函数:
创建REST API 端点
现在让我们使用Django REST框架来创建一个简单的API。我们稍后将在创建web页面时开始使用它。
首先,定义一个序列化器:
创建一个视图:
另外,别忘了向urlpatterns列表中添加一个新的url:
创建一个页面
最后一步是创建一个页面。我将使用Vue.js以便在不刷新页面的情况下动态刷新演讲列表。但是你可以使用任何你想使用的工具。甚至于用纯Javascript编写所有东西。我选择Vue.js是因为它简单易用。
我们来添加一个视图:
创建一个模板:
并更新urlpattern:
结论
在本文中,我们从较高的层次介绍了Elasticsearch,但是它有许多特性是超出本文范围的。
为了进一步学习,你可以阅读文档,或者更好的方法是尝试自己构建一些东西。玩得开心!
英文原文:https://apirobot.me/posts/django-elasticsearch-searching-for-awesome-ted-talks
译者:野生大熊猫