在本文中,我们将介绍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数据库的原因如下:

  1. 它运行的相当快;

  2. 它可以规模化;

  3. 它有很多很酷的组件,比如用于可视化数据的Kibana、用于收集和转换数据的Logstash等等。

与Elasticsearch的通信是通过RESTful API实现的。因此,所有操作都可以通过HTTP进行。如果你以前已经使用过RESTful API,那么通信对你来说应该很顺畅。

Elasticsearch是NoSQL数据库。它将数据存储为JSON文档,并且不会对数据施加严格的结构,这意味着你可以在JSON文档中放入任何你想要的内容。

这些JSON文档是在类型和索引中进行组织的。每个文档都属于一个类型。类型本身存在于索引中。每个索引只能包含一个类型。

我们可以将Elasticsearch存储数据的方式与其他关系型数据库存储数据的方式进行对比:

关系型数据库 → 数据库 → 表 → 行 → 列

Elasticsearch →索引 → 类型 → 文档 →字段

惟一的区别是在关系型数据库中,每个数据库可以有许多表。但是在Elasticsearch中,每个索引只能有一种类型。

在以前的Elasticsearch版本中,一个索引可以有不止一种类型,但是现在它被弃用了。如果你想知道为什么,你可以在这里进行阅读。地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.1/removal-of-types.html

Elasticsearch 请求

是时候开始动手了,我们来向Elasticsearch发出第一个请求:

在这个请求中,我们实际上做了很多事情:

  1. 创建了一个索引 tweets

  2. 创建了一个类型 doc

  3. 对一个包含有关一条推文信息的新文档进行了索引

现在我们来索引其他几个文档:

为了检索单个文档,我们可以发出一个GET请求并指定一个该文档的地址。其索引、类型和id如下:

对所有文档的简单搜索如下:

但是我们现在所做的“搜索”是没有用的,因为它只返回了一个所有文档的列表。让我们进行一个真正的搜索,并试图找到特定作者的文档:

我们可以更进一步,让它变得更复杂。例如,让我们对文本字段进行全文搜索,并根据tweet拥有的点赞数量来对其进行筛选:

或者代替按“赞”来过滤推文,我们可以对其进行排序,并将最受欢迎的推文显示在第一个:

Django和 Elasticsearch 实战

现在,当你了解了Elasticsearch是什么以及如何使用它时,让我们用Django来创建一个简单的web应用程序,它将使用Elasticsearch的强大功能。

我们将尝试创建一个web应用程序,它将帮助我们搜索精彩的TED演讲。最终的结果是这样的:

首先,我们将下载关于TED演讲的原始数据,比如它们的名称、描述、文字记录等等。然后,我们将该数据插入到关系型数据库中,并将关系型数据库中的部分数据索引到Elasticsearch中。之后,我们将创建一个页面,该页面将与Elasticsearch进行交互,并根据用户在该页面上键入的搜索查询来显示最相关并且最流行的演讲。

你可以在这里找到这个应用程序的源代码。地址:https://github.com/apirobot/django-elasticsearch-ted-talks

设置项目

我们的项目将使用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
译者:野生大熊猫

elasticsearch工具类_Django + Elasticsearch——搜索精彩的TED演讲相关推荐

  1. ElasticSearch工具类封装

    最近在项目中有看到一种比较实用的ElasticSearch工具类封装方式,特此记录便于日后查阅.         1.controller层 @RequestMapping(value = " ...

  2. Elasticsearch实现类百度搜索引擎搜索功能ES5.5.0v

    2019独角兽企业重金招聘Python工程师标准>>> 源码地址: GitHub 业务需求(使用背景): 实现搜索引擎前缀搜索功能(中文,拼音前缀查询及简拼前缀查询功能) 实现摘要全 ...

  3. Java集成ElasticSearch及配置类工具类整理

    Java集成ElasticSearch及配置类工具类整理 前言:做一个有梦想的程序猿! ES不同的版本API差异比较大,此处ES版本为:6.5.3 代码如下: 添加Maven依赖 <!-- ES ...

  4. 4 ElasticSearch java api封装工具类

    上一篇讲了通过http请求对ElasticSearch的增删改查操作,java也提供了相应的api来完成这些操作,这一篇是根据java的api封装的工具类. 地址为:http://blog.csdn. ...

  5. Elasticsearch教程(27) ES拼接查询条件的工具类

    一.前言 在大多数公司产线Elasticsearch还在6.X的时候,ES已经更新到8.X了,这更新速度也太快了. 目前我手上的项目也做到一套工具类兼容ES6.1到ES7.9+.我用的是原生的ES6. ...

  6. elasticsearch搜索引擎查询java工具类

    Elasticsearch查询java工具类 项目组使用Elasticsearch搜索引擎也有一段时间了,刚开始是2.4版本,现在又要在新的工程中使用,准备升级为5.4版本,以前的工具类也不好用了,没 ...

  7. Spring boot 项目(二十六)——集成elasticsearch实现简单的书籍搜索

    前期准备 本地安装好es:安装教程 项目结构 代码编写 1.pom文件 <dependencies><!--springboot通用--><dependency>& ...

  8. ElasticSearch原理应用以及京东搜索案例

    ElasticSearch原理,应用以及仿京东搜索功能 1.ElasticSearch简介 ElasticSearch:智能搜索,分布式的搜索引擎 是ELK的一个组成,是一个产品,而且是非常完善的产品 ...

  9. elasticsearch实战三部曲之三:搜索操作

    elasticsearch实战三部曲之三:搜索操作 2019年01月13日 21:35:18 博陵精骑 阅读数:1367 标签: elasticsearch 更多 个人分类: elasticsearc ...

最新文章

  1. 垃圾邮件过滤 php,垃圾邮件过滤功能
  2. nginx 只写了listen80 没有 listen443 用https访问
  3. 如何让for循环中最后一次的输出和循环体的不一样
  4. Java学习笔记之 IO包 字节流
  5. wat java_并发工具优于wati、notify(69)
  6. php 怎么查看原生方法源码_你的2020搜索账单地址入口 你的2020搜索账单怎么查看查看方法...
  7. 因为未启用行移动功能 不能闪回表
  8. C++ 编码规范建议
  9. 转:为 setuptools 开路搭桥
  10. xampp中mysql使用教程_XAMPP的安装及使用教程
  11. 如何识别服务器连接的偶发故障?
  12. 千呼万唤始出来,犹抱琵琶半遮面,揭开HMM的神秘面纱
  13. 三级面包屑的页面跳转到二级面包屑页面时,报错:Rendered fewer hooks than expected.
  14. 牛客 · 奇♂妙拆分
  15. [转载]拥抱Jini:从Starter Kit 2.0开始(第一部分)
  16. 人活到极致,一定是素与简
  17. DINE: Domain Adaptation from Single and Multiple Black-box Predictors
  18. State Threads 回调终结者
  19. 安超云入选《鲲鹏精选解决方案》
  20. bulldog1——爆破、命令执行、pty提权

热门文章

  1. language support图标在哪里?怎么消失了?
  2. JDK 9 中有哪些 jmod 文件?
  3. LVM源码分析2-libdaemon
  4. Mongodb3.4 复制集及分片配置
  5. SQL练习题完整(做完你就是高手)
  6. IHttpModule的那些事
  7. Golang实现简单爬虫框架(5)——项目重构与数据存储
  8. SpaceEmacs Rocks Day8 学习笔记
  9. 高性能apache服务器配置大并发教程MPM模块配置
  10. SpringMVC(3):DispatcherServlet详解