设为首页 收藏本站
查看: 1997|回复: 0

[经验分享] 在 Python 中使用 Elasticsearch-Python & Golang 学习

[复制链接]

尚未签到

发表于 2019-1-28 14:13:30 | 显示全部楼层 |阅读模式
  在这篇文章中,我将讨论 Elasticsearch 以及如何将其整合到不同的 Python 应用程序中。
什么是 ElasticSearch?
  ElasticSearch(ES)是一个建立在 Apache Lucene 之上的高度可用的分布式开源搜索引擎。它基于 Java 构建的,因此可用于许多平台。数据以 JSON 格式非结构化存储,这也使其成为一种 NoSQL 数据库。与其他 NoSQL 数据库不同,ES 还提供搜索引擎功能和其他相关功能。
ElasticSearch 用例
  ES 可用于多种目的,下面给出了其中的几个:
  你运营着提供大量动态内容的网站,比如电子商务网站或者博客。通过实施ES,你不仅可以为Web应用程序提供强大的搜索引擎,还可以在应用程序中提供原生自动补全功能。
  你可以获取不同类型的日志数据,然后可以使用它来查找趋势和统计信息。
设置和运行
  安装 ElasticSearch 最简单的方法就是下载并运行可执行文件。必须确保使用的是 Java 7   或更高版本。
下载后解压缩并运行它的二进制文件。
  滚动窗口中会出现很多文字。如果你看到像下面这样的,那么它应该是完成了。
  但是,由于眼见为实,可以在浏览器中访问 URLhttp://localhost:9200 或者通过 cURL 查看类似于这样的欢迎界面以便你知道确实成功安装了:

  在我开始访问 Python 中的 Elastic Search 之前,我们来做一些基本的东西。 正如我提到ES 提供了一个 REST API 接口,我们将使用它来执行不同的任务。
基本示例
  你要做的第一件事就是创建索引。一切都以索引形式存储。RDBMS 概念中索引相当于一个数据库,因此不要将它与你在 RDBMS 中学习的典型索引概念混淆。使用 PostMan 来运行 REST API。如果它成功运行,你会看到如下所示的回应:

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

  暂时不用管 mappings 是什么,我们会在后面讨论它。它实际上做的只是创建一个你自己的 Schema 文档。creation_date 是不言自明的。number_of_shards 表示将保留此索引数据的分区数量。将整个数据保存在单个磁盘上毫无意义。如果你运行的是多个 Elastic 节点的集群,那么整个数据都会被分割。简而言之,如果有 5 个分片,则整个数据可以在 5 个分片中使用,并且 ElasticSearch 集群可以服务来自其任何节点的请求。
  副本讨论的是你的数据的镜像。如果你熟悉主从概念,那么这对你来说不应该是新事物。你可以了解更多关于基本 ES 概念。
创建索引的 cURL 版本是单线程的。
  你也可以一次执行索引创建和记录插入任务。你所要做的就是以 JSON 格式传递你的记录。你可以在 PostMan 中使用下面的东西:

请确保你将 Content-Type 设置为 application/json.
  一个名为 company 的索引会被创建如果它原本不存在的话,然后在这里创建一个名为  employees 的新类型。Type 实际上是 RDBMS 中的表的 ES 版本。
  上述请求将输出以下   JSON 结构:


  你传递 /1 作为你的记录的>  你会看到如下所示的内容:
  你可以看到元和实际记录。 如果你想,可以将请求更改为http://localhost:9200/company/employees/1/_source,
  那么就会仅输出 JSON 结构记录。
  cURL 版本将是:
  如果你想更新该记录怎么办?这很简单。你所要做的就是改变你的   JSON 记录。如下所示:

  它会生成以下输出:

  注意现在 _result 字段设置为 updated 而不是  created 。
  当然,你也可以删除某些记录。

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

  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 中。我们还将创建一个严格的模式或映射,以便我们确保数据以正确的格式和类型进行索引。最后只要列出沙拉食谱的清单。我们开始吧!
获取数据


  所以这是获取数据的基本程序。因为我们需要 JSON 格式的数据,所以我对其进行了相应的转换。
创建索引
  我们得到了所需的数据,接下来我们必须存储它。我们要做的第一件事就是创建一个索引。让我们将其命名为 recipes。 该类型将被称为 salads。我要做的另一件事是创建我们的文档结构的映射。
  在我们创建索引之前,我们必须连接 ElasticSearch 服务器。

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

  这里有很多要说的事。首先,我们传递了一个包含整个文档结构映射的配置变量。映射是模式这一术语在 Elastic 的版本。就像我们在表格中设置特定的字段数据类型一样,我们在这里做类似的事情。检查文档,它涵盖的不仅仅是这些。所有字段都是文本类型,但是 calories 类型为 Integer。
  接下来,我确保索引不存在,然后创建它。参数 ignore = 400 在检查后不再需要,但存在性证明是必要的,因为这可以防止错误地覆盖现有索引。虽然这很危险。这就像覆盖数据库。
  如果索引成功创建,你可以通过访问 http://localhost:9200/recipes/_mappings 来验证它,它会输出如下所示的内容:

  通过传递 dynamic:strict 我们使 Elasticsearch 严格检查任何传入的文档。在这里,salads 实际上是文档类型。Type 实际上是 Elasticsearch 对 RDBMS 表的回答。
记录索引
  下一步是存储实际的数据或文档。
  运行它,你会看到:
  你能猜到为什么会这样吗?由于我们没有在我们的映射中设置 ingredients,因此 ES 不允许我们存储包含 ingredients 字段的文档。现在你知道事先分配映射的优势了。你可以通过这样做避免破坏数据。现在,让我们稍微修改一下映射,现在看起来如下所示:

  我们添加 nested 类型的 ingrdients,然后分配内部字段的数据类型,即在我们的案例中的 text。
  nested 数据类型允许设置嵌套的 JSON 对象的类型。再次运行它,你将看到以下输出:


  由于你根本没有传递 _id,因此 ES 本身为存储的文档分配了一个动态>

  在我们继续之前,让我们在 calories 字段中发送一个字符串,看看它是如何发生的。请记住,我们已将其设置为整数。 在编制索引时出现以下错误:
  所以现在你知道为文档分配一个映射的好处了。如果你不这样做,它仍然会工作,因为 Elasticsearch 将在运行时分配它自己的映射。
查询记录
  现在,记录被编入索引,是时候根据我们的需要查询它们了。我将创建一个名为 search()  的函数,它将显示我们的查询结果。
  这是非常基本的。 你在其中传递索引和搜索条件。让我们尝试一些查询。
  上述查询将返回卡路里等于 102 的所有记录。在我们的情况下,输出将是:

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

  你也可以指定想要返回的列或字段。上述查询将返回卡路里大于 20 的所有记录。此外,它将仅在 _source 下显示>结论
  Elasticsearch 是一个功能强大的工具,它可以提供强大的功能帮助你来返回最准确的结果集,从而使你现有的或新的应用程序可搜索。我刚刚讲述了它的要点,你可以继续阅读文档并熟悉这个强大的工具。尤其是模糊搜索功能非常棒。如果我有机会,我会在即将发布的帖子中介绍 Query DSL。
  英文原文:http://blog.adnansiddiqi.me/getting-started-with-elasticsearch-in-python/
  译者:β
  Python 技术交流群:238757010
51Reboot Python 实战班第19期火热招生中
  详情扫码咨询:



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-668791-1-1.html 上篇帖子: ElasticSearch性能优化方案 下篇帖子: elasticsearch常用操作命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表