第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查询-术语级查询

另外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”:“

  HkRyTYXvSkGvvvHX2Q1-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“

  },

  ”标语“:”您知道,要搜索“

}

现在,在我继续使用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”:“公司”,

    “    _ type ”:“员工”,

    “

_ id”:“ 1”,“ _ version”:1,

    “结果”:“已创建”,

    “ _ shards”:{

        “总计”:2,

        “成功”:1,

        “失败”:0

    },

    “ _ seq_no”:0,

    “ _ primary_term”:1

}

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

{“ _index”:“公司”,“ _ type”:“员工”,“ _ id”:“ 1”,“ _ version”:1,“ found”:true,“ _ source”:{

    “ name”:“ Adnan Siddiqi” ,

    “职业”:“顾问”

}

您可以看到实际记录以及元数据。如果您愿意,可以将请求更改为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。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351