乐趣区

第14篇Python中的Elasticsearch入门

我的 Elasticsearch 系列文章,逐渐更新中,欢迎关注
0A. 关于 Elasticsearch 及实例应用
00.Solr 与 ElasticSearch 对比
01.ElasticSearch 能做什么?
02.Elastic Stack 功能介绍
03. 如何安装与设置 Elasticsearch API
04. 如果通过 elasticsearch 的 head 插件建立索引_CRUD 操作
05.Elasticsearch 多个实例和 head plugin 使用介绍
06. 当 Elasticsearch 进行文档索引时,它是如何工作的?
07.Elasticsearch 中的映射方式—简洁版教程
08.Elasticsearch 中的分析和分析器应用方式
09.Elasticsearch 中构建自定义分析器
10.Kibana 科普 - 作为 Elasticsearhc 开发工具
11.Elasticsearch 查询方法
12.Elasticsearch 全文查询
13.Elasticsearch 查询 - 术语级查询
14.Python 中的 Elasticsearch 入门

另外 Elasticsearch 入门,我强烈推荐 ElasticSearch 搭建手册给你,非常想尽的入门指南手册。

在本文中,我将讨论 Elasticsearch 以及如何将其与不同的 Python 应用程序集成。

什么是 ElasticSearch?

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

ElasticSearch 用例

您可以将 ES 用于多种用途,下面提供了其中的几个:

您正在运行的网站提供许多动态内容。无论是电子商务网站还是博客。通过实施 ES,您不仅可以为您的 Web 应用程序提供强大的搜索引擎,还可以在应用程序中提供本机自动完成功能。

您可以摄取不同种类的日志数据,然后可以用来查找趋势和统计数据。

设置和运行
安装 ElasticSearch 的最简单方法是下载并运行可执行文件。您必须确保使用的是 Java 7 或更高版本。
下载后,解压缩并运行其二进制文件。

elasticsearch-6.2.4 bin / elasticsearch

滚动窗口中将有很多文本。如果您看到类似下面的内容,则表明情况已解决。

[2018-05-27T17:36:11,744] [INFO] [oehnNetty4HttpServerTransport] [c6hEGv4] publish_address {127.0.0.1:9200}、bound_addresses {[:: 1]:9200},{127.0.0.1:9200}

但是,既然眼见为实,http://localhost:9200 那就在浏览器中或通过 cURL 访问 URL,下面的内容应该会很欢迎您。

{
“name” : “c6hEGv4”,
“cluster_name” : “elasticsearch”,
“cluster_uuid” : “HkRyTYXvSkGvkvHX2Q1-oQ”,
“version” : {

"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"

},
“tagline” : “You Know, for Search”
}

现在,在我继续使用 Python 访问 Elastic Search 之前,让我们做一些基本的事情。正如我提到的,ES 提供了 REST API,我们将使用它来执行不同的任务。
基本范例
您要做的第一件事就是创建一个 指数。一切都存储在索引中。RDBMS 相当于指数 是一个 数据库 因此,请勿将其与您在 RDBMS 中学习的典型索引概念混淆。我正在使用 PostMan 运行 REST API。

如果运行成功,您将在下面看到类似的响应。

{

“acknowledged”:true,“shards_acknowledged”:true,“index”:“company”

}

因此,我们创建了一个名为 company 的数据库。换句话说,我们创建了一个名为 company 的索引。如果您通过浏览器进行访问,则会看到类似以下内容:

http://localhost:9200/company
{“company”:{“aliases”:{},“mappings”:{ },“settings”:{“index”:{“creation_date”:“1527638692850”,“number_of_shards”:“5”,“number_of_replicas”:“1”,“uuid”:“RnT-gXISSxKchyowgjZOkQ”,“version”:{“created”:“6020499”},“provided_name”:“company”} 
    } 
  } 
}

稍等片刻 mappings,我们稍后再讨论。实际上只不过是创建文档的架构而已。creation_date 是不言自明的。的 number_of_shards 讲述,将让这个数据分区的数量指标。将全部数据保存在单个磁盘上根本没有任何意义。如果您正在运行包含多个 Elastic 节点的集群,则整个数据将在它们之间拆分。简而言之,如果有 5 个分片,则整个数据可在 5 个分片上使用,并且 ElasticSearch 集群可以处理来自其任何节点的请求。
副本谈论数据的镜像。如果您熟悉主从概念,那么这对您来说应该不是新知识。您可以在此处了解有关基本 ES 概念的更多信息。
创建索引的 cURL 版本是单行的。

➜elasticsearch-6.2.4 curl -X PUT 本地主机:9200 / company 
{“acknowledged”:true,“shards_acknowledged”:true,“index”:“company”}%

您还可以一次执行索引创建和记录插入任务。您要做的就是以 JSON 格式传递记录。在 PostMan 中,您可以像下面这样。

确保设置 Content-Type 为 application/json
company 如果它不存在,它将在此处创建一个名为的索引,然后在此处创建一个名为 employee 的新类型。类型实际上是 RDBMS 中表的 ES 版本。
上面的请求将输出以下 JSON 结构。

{
    "_index": "company",
    "_type": "employees",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

您通过 / 1 作为记录的 ID。虽然没有必要。要做的就是_id 用 value 设置 field 1。然后,您以 JSON 格式传递数据,该数据最终将作为新记录或文档插入。如果您 http://localhost:9200/company/employees/ 1 从浏览器访问,您将看到以下内容。

{"_index":"company","_type":"employees","_id":"1","_version":1,"found":true,"_source":{
    "name": "Adnan Siddiqi",
    "occupation": "Consultant"
}
 }

您可以看到实际记录以及元数据。如果您愿意,可以将请求更改为 http://localhost:9200/company/employees/1/_source,它将仅输出记录的 JSON 结构。
cURL 版本为:

{
  "name" : "c6hEGv4",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "HkRyTYXvSkGvkvHX2Q1-oQ",
  "version" : {
    "number" : "6.2.4",
    "build_hash" : "ccec39f",
    "build_date" : "2018-04-12T20:37:28.497551Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

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

它将生成以下输出:

{
  "company": {"aliases": {},
    "mappings": { },
    "settings": {
      "index": {
        "creation_date": "1527638692850",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "uuid": "RnT-gXISSxKchyowgjZOkQ",
        "version": {"created": "6020499"},
        "provided_name": "company"
      }
    }
  }
}

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

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

{
    "_index": "company",
    "_type": "employees",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

该 max_score 字段指示记录的相关性,即记录的最高分数。如果有多个记录,那么它将是另一个数字。

您还可以通过传递字段名称来将搜索条件限制为某个字段。因此,http://localhost:9200/company/employees/_search?q=name:Adnan 将仅在 name 文档的字段中搜索。它实际上等效于 SQLSELECT * from table where name=’Adnan’
我只介绍了基本示例。ES 可以做很多事情,但是我将通过阅读文档让您进一步探索它,然后切换到使用 Python 访问 ES。

在 Python 中访问 ElasticSearch
老实说,ES 的 REST API 足够好,您可以使用 requests 库来执行所有任务。不过,您可以将 Python 库用于 ElasticSearch,以专注于主要任务,而不必担心如何创建请求。
通过 pip 安装它,然后可以在 Python 程序中访问它。
pip install elasticsearch
为确保已正确安装,请从命令行运行以下基本代码段:

➜elasticsearch-6.2.4 python
Python 3.6.4 | Anaconda 自定义(64 位)|(默认值,2018 年 1 月 16 日,12:04:33)
在 darwin 上使用 [GCC 4.2.1 兼容的 Clang 4.0.1(标签 / RELEASE_401 / final)] 输入以下内容的
“帮助”,“版权”,“信用”或“许可证”更多信息。

➜ elasticsearch-6.2.4 python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 12:04:33)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.

>>> from elasticsearch import Elasticsearch
>>> es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
>>> es
<Elasticsearch([{'host': 'localhost', 'port': 9200}])>

网页搜索和 Elasticsearch
让我们讨论一下使用 Elasticsearch 的一些实际用例。目的是访问在线食谱并将其存储在 Elasticsearch 中以用于搜索和分析目的。我们将首先从 Allrecipes 抓取数据并将其存储在 ES 中。如果是 ES,我们还将创建一个严格的 Schema 或映射,以便确保以正确的格式和类型对数据进行索引。我只是拉沙拉食谱的清单而已。让我们开始!
抓取数据

结论
Elasticsearch 是一个功能强大的工具,通过提供强大的功能以返回最准确的结果集,可以帮助您搜索现有或新应用。我刚刚介绍了要点。阅读文档并熟悉这个强大的工具。特别是模糊搜索功能非常出色。如果有机会,我将在以后的文章中介绍 Query DSL。

退出移动版