Elasticsearch简介与实战

什么是Elasticsearch?

  Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。
  Lucene 能够说是当下最早进、高性能、全功能的搜索引擎库——不管是开源仍是私有,但它也仅仅只是一个库。为了充分发挥其功能,你须要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能须要得到信息检索学位才能了解其工做原理,由于Lucene 很是复杂。
  为了解决Lucene使用时的繁复性,因而Elasticsearch便应运而生。它使用 Java 编写,内部采用 Lucene 作索引与搜索,可是它的目标是使全文检索变得更简单,简单来讲,就是对Lucene 作了一层封装,它提供了一套简单一致的 RESTful API 来帮助咱们实现存储和检索。
  固然,Elasticsearch 不只仅是 Lucene,而且也不只仅只是一个全文搜索引擎。 它能够被下面这样准确地形容:java

  • 一个分布式的实时文档存储,每一个字段能够被索引与搜索;
  • 一个分布式实时分析搜索引擎;
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。

因为Elasticsearch的功能强大和使用简单,维基百科、卫报、Stack Overflow、GitHub等都纷纷采用它来作搜索。如今,Elasticsearch已成为全文搜索领域的主流软件之一。
  下面将介绍Elasticsearch的安装与简单使用。node

安装并运行Elasticsearch

  安装 Elasticsearch 以前,你须要先安装一个较新版本的 Java,最好的选择是,你能够从 www.java.com 得到官方提供的最新版本的Java。
  你能够从 elastic 的官网 elastic.co/downloads/elasticsearch 获取最新版本的Elasticsearch。解压文档后,按照下面的操做,便可在前台(foregroud)启动 Elasticsearch:web

cd elasticsearch-<version>
./bin/elasticsearch

此时,Elasticsearch运行在本地的9200端口,在浏览器中输入网址“http://localhost:9200/”,若是看到如下信息就说明你的电脑已成功安装Elasticsearch:算法

{
  "name" : "YTK8L4q",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "hB2CZPlvSJavhJxx85fUqQ",
  "version" : {
    "number" : "6.5.4",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "d2ef93d",
    "build_date" : "2018-12-17T21:17:40.758843Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

在这里,咱们安装的Elasticsearch版本号为6.5.4。
  Kibana 是一个开源的分析和可视化平台,旨在与 Elasticsearch 合做。Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员能够轻松地执行高级数据分析,并在各类图表、表格和地图中可视化数据。
  你能够从 elastic 的官网 https://www.elastic.co/downloads/kibana 获取最新版本的Kibana。解压文档后,按照下面的操做,便可在前台(foregroud)启动Kibana:数据库

cd kibana-<version>
./bin/kabana

此时,Kibana运行在本地的5601端口,在浏览器中输入网址“http://localhost:5601”,便可看到如下界面:数组

Kibana启动界面

  下面,让咱们来了解Elasticsearch的一些基本概念,这有助于咱们更好地理解和使用Elasticsearch。浏览器

Elasticsearch基本概念

全文搜索(Full-text Search)

  全文检索是指计算机索引程序经过扫描文章中的每个词,对每个词创建一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先创建的索引进行查找,并将查找的结果反馈给用户的检索方式。
  在全文搜索的世界中,存在着几个庞大的帝国,也就是主流工具,主要有:服务器

  • Apache Lucene
  • Elasticsearch
  • Solr
  • Ferret

倒排索引(Inverted Index)

  该索引表中的每一项都包括一个属性值和具备该属性值的各记录的地址。因为不是由记录来肯定属性值,而是由属性值来肯定记录的位置,于是称为倒排索引(inverted index)。Elasticsearch可以实现快速、高效的搜索功能,正是基于倒排索引原理。微信

节点 & 集群(Node & Cluster)

  Elasticsearch 本质上是一个分布式数据库,容许多台服务器协同工做,每台服务器能够运行多个Elasticsearch实例。单个Elasticsearch实例称为一个节点(Node),一组节点构成一个集群(Cluster)。运维

索引(Index)

  Elasticsearch 数据管理的顶层单位就叫作 Index(索引),至关于关系型数据库里的数据库的概念。另外,每一个Index的名字必须是小写。

文档(Document)

  Index里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。同一个 Index 里面的 Document,不要求有相同的结构(scheme),可是最好保持相同,这样有利于提升搜索效率。

类型(Type)

  Document 能够分组,好比employee这个 Index 里面,能够按部门分组,也能够按职级分组。这种分组就叫作 Type,它是虚拟的逻辑分组,用来过滤 Document,相似关系型数据库中的数据表。
  不一样的 Type 应该有类似的结构(Schema),性质彻底不一样的数据(好比 products 和 logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然能够作到)。

文档元数据(Document metadata)

  文档元数据为_index, _type, _id, 这三者能够惟一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的惟一标识。

字段(Fields)

  每一个Document都相似一个JSON结构,它包含了许多字段,每一个字段都有其对应的值,多个字段组成了一个 Document,能够类比关系型数据库数据表中的字段。
  在 Elasticsearch 中,文档(Document)归属于一种类型(Type),而这些类型存在于索引(Index)中,下图展现了Elasticsearch与传统关系型数据库的类比:

Elasticsearch入门

  Elasticsearch提供了多种交互使用方式,包括Java API和RESTful API ,本文主要介绍RESTful API 。全部其余语言可使用RESTful API 经过端口 9200 和 Elasticsearch 进行通讯,你能够用你最喜好的 web 客户端访问 Elasticsearch 。甚至,你还可使用 curl 命令来和 Elasticsearch 交互。
  一个Elasticsearch请求和任何 HTTP 请求同样,都由若干相同的部件组成:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

返回的数据格式为JSON,由于Elasticsearch中的文档以JSON格式储存。其中,被 < > 标记的部件:

部件 说明
VERB 适当的 HTTP 方法 或 谓词 : GETPOSTPUTHEAD 或者 DELETE
PROTOCOL http 或者 https(若是你在 Elasticsearch 前面有一个 https 代理)
HOST Elasticsearch 集群中任意节点的主机名,或者用 localhost 表明本地机器上的节点。
PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
PATH API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY 一个 JSON 格式的请求体 (若是请求须要的话)

对于HTTP方法,它们的具体做用为:

HTTP方法 说明
GET 获取请求对象的当前状态
POST 改变对象的当前状态
PUT 建立一个对象
DELETE 销毁对象
HEAD 请求获取对象的基础信息

  咱们如下面的数据为例,来展现Elasticsearch的用法。

如下所有的操做都在Kibana中完成,建立的index为conference, type为event .

插入数据

  首先建立index为conference, 建立type为event, 插入id为1的第一条数据,只需运行下面命令就行:

PUT /conference/event/1
{
  "host": "Dave",
  "title": "Elasticsearch at Rangespan and Exonar",
  "description": "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch",
  "attendees": ["Dave", "Andrew", "David", "Clint"],
  "date": "2013-06-24T18:30",
  "reviews": 3
}

在上面的命令中,路径/conference/event/1表示文档的index为conference, type为event, id为1. 相似于上面的操做,依次插入剩余的4条数据,完成插入后,查看数据以下:

插入数据

删除数据

  好比咱们想要删除conference中event里面id为5的数据,只需运行下面命令便可:

DELETE /conference/event/5

返回结果以下:

{
  "_index" : "conference",
  "_type" : "event",
  "_id" : "5",
  "_version" : 2,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

表示该文档已成功删除。若是想删除整个event类型,可输入命令:

DELETE /conference/event

若是想删除整个conference索引,可输入命令:

DELETE /conference
修改数据

  修改数据的命令为POST, 好比咱们想要将conference中event里面id为4的文档的做者改成Bob,那么须要运行命令以下:

POST /conference/event/4/_update
{
  "doc": {"host": "Bob"}
}

返回的信息以下:(表示修改数据成功)

{
  "_index" : "conference",
  "_type" : "event",
  "_id" : "4",
  "_version" : 7,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 7,
  "_primary_term" : 1
}

查看修改后的数据以下:

修改数据

查询数据

  查询数据的命令为GET,查询命令也是Elasticsearch最为重要的功能之一。好比咱们想查询conference中event里面id为1的数据,运行命令以下:

GET /conference/event/1

返回的结果以下:

{
  "_index" : "conference",
  "_type" : "event",
  "_id" : "1",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "host" : "Dave",
    "title" : "Elasticsearch at Rangespan and Exonar",
    "description" : "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch",
    "attendees" : [
      "Dave",
      "Andrew",
      "David",
      "Clint"
    ],
    "date" : "2013-06-24T18:30",
    "reviews" : 3
  }
}

在_source 属性中,内容是原始的 JSON 文档,还包含有其它属性,好比_index, _type, _id, _found等。
  若是想要搜索conference中event里面全部的文档,运行命令以下:

GET /conference/event/_search

返回结果包括了全部四个文档,放在数组 hits 中。
  固然,Elasticsearch 提供更加丰富灵活的查询语言叫作 查询表达式 , 它支持构建更加复杂和健壮的查询。利用查询表达式,咱们能够检索出conference中event里面全部host为Bob的文档,命令以下:

GET /conference/event/_search
{
    "query" : {
        "match" : {
            "host" : "Bob"
        }
    }
}

返回的结果只包括了一个文档,放在数组 hits 中。
  接着,让咱们尝试稍微高级点儿的全文搜索——一项传统数据库确实很难搞定的任务。搜索下全部description中含有"use Elasticsearch"的event:

GET /conference/event/_search
{
    "query" : {
        "match" : {
            "description" : "use Elasticsearch"
        }
    }
}

返回的结果(部分)以下:

{
 ...
  "hits" : {
    "total" : 2,
    "max_score" : 0.65109104,
    "hits" : [
      {
        ...
        "_score" : 0.65109104,
        "_source" : {
          "host" : "Dave Nolan",
          "title" : "real-time Elasticsearch",
          "description" : "We will discuss using Elasticsearch to index data in real time",
          ...
        }
      },
      {
        ...
        "_score" : 0.5753642,
        "_source" : {
          "host" : "Dave",
          "title" : "Elasticsearch at Rangespan and Exonar",
          "description" : "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch",
          ...
        }
      }
    ]
  }
}

返回的结果包含了两个文档,放在数组 hits 中。让咱们对这个结果作一些分析,第一个文档的description里面含有“using Elasticsearch”,这个能匹配“use Elasticsearch”是由于Elasticsearch含有内置的词干提取算法,以后两个文档按_score进行排序,_score字段表示文档的类似度(默认的类似度算法为BM25)。
  若是想搜索下全部description中严格含有"use Elasticsearch"这个短语的event,可使用下面的命令:

GET /conference/event/_search
{
    "query" : {
        "match_phrase": {
            "description" : "use Elasticsearch"
        }
    }
}

这时候返回的结果只有一个文档,就是上面输出的第二个文档。
  固然,Elasticsearch还支持更多的搜索功能,好比过滤器,高亮搜索,结构化搜索等,但愿接下来能有更多的时间和经从来介绍~

总结

  后续有机会再介绍如何利用Python来操做Elasticsearch~
  本次分享到此结束,感谢你们阅读~

注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎你们关注哦~~

相关文章
相关标签/搜索