Elasticsearch 简介

Elasticsearch 是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch 是由 Elastic 公司创建并开源维护的。它的开源代码位于 https://github.com/elastic/elasticsearch。同时,Elastic 公司也拥有 Logstash 及 Kibana 开源项目。这个三个开源项目组合在一起,就形成了 ELK 软件栈。他们三个共同形成了一个强大的生态圈。简单地说,Logstash 负责数据的采集,处理(丰富数据,数据转型等),Kibana 负责数据展,分析及管理。Elasticsearch 处于最核心的位置,它可以帮我们对数据进行快速地搜索及分析。

事实上Elasticsearch的完整栈有如下的几个:

Beats 是一些轻量级可以允许在客户端服务器中的代理。它并不需要部署到我们的 Elastic 云中。它可以帮我们收集所有需要的事件。如果把 beats 也纳入到我的架构中,那么 Elastic 的栈可以表述为:

在今天的这篇文章中,我来简单地介绍一下什么是 Elasticsearch

Elastic产品生态

Elastic 围绕 Elasticsearch 已经建立了许多成熟的方案。更多详情请参阅我们的官方网站 https://www.elastic.co/

 

Elasticsearch

简单地说, Elaaticsearch 是一个分布式的使用REST接口的搜索引擎。它的产品可以在https://www.elastic.co/products/elasticsearch 进行下载。Elasticsearch 是一个分布式的基于 REST 接口的为云而设计的搜索引擎,它的功能包括:

Elasticsearch是一个基于Apache Lucene (TM)的开源搜索引擎,无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene 只是一个库。Lucene 本身并不提供高可用性及分布式部署。想要发挥其强大的作用,你需使用 Java 并要将其集成到你的应用中。Lucene 非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。 


Elasticsearch 也是使用 Java 编写并使用 Lucene 来建立索引并实现搜索功能,但是它的目的是通过简单连贯的 RESTful API 让全文搜索变得简单并隐藏 Lucene 的复杂性。 

不过,Elasticsearch 不仅仅是 Lucene 和全文搜索引擎,它还提供:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 实时分析的分布式搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

而且,所有的这些功能被集成到一台服务器,你的应用可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之交互。上手 Elasticsearch 非常简单,它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。Elasticsearch 在 Apache 2 license 下许可使用,可以免费下载、使用和修改。 
随着知识的积累,你可以根据不同的问题领域定制 Elasticsearch 的高级特性,这一切都是可配置的,并且配置非常灵活。

Elasticsearch 的特点是它提供了一个极速的搜索体验。这源于它的高速(speed)。相比较其它的一些大数据引擎,Elasticsearch 可以实现秒级的搜索,但是对于它们来说,可能需要数小时才能完成。Elasticsearch 的 cluster 是一种分布式的部署,极易扩展(scale)。这样很容易使它处理 petabytes 的数据库容量。最重要的是 Elasticsearch 是它搜索的结果可以按照分数进行排序,它能提供我们最相关的搜索结果(relevance)。

 

分布式及高可用性的搜素引擎

  1. 每个索引(index)都使用可配置数量的分片进行完全分片
  2. 每个分片都可以有一个或多个副本
  3. 在任何副本分片上执行的读取/搜索操作

多租户

  1. 支持多个索引
  2. 索引级别配置(分片数,索引存储,......)

各种API

  1. HTTP RESTful API
  2. Native Java API
  3. 所有 API 都执行自动节点操作重新路由

面向文档

  1. 无需前期定义 schema (文档结构)
  2. 可以定义 schema 以定制索引过程

可靠,异步写入,可实现长期持续性

(近)实时搜索

建在 Lucene 之上

  1. 每个分片都是一个功能齐全的 Lucene 索引
  2. Lucene的所有功能都可以通过简单的配置/插件轻松暴露出来

每次操作一致性

  1. 单文档级操作具有原子性,一致性,隔离性和持久性。

 

入门指南

首先,不要恐慌。 获得Elasticsearch的全部内容需要5分钟。

前提要求

你需要在你的电脑上安装最新的 Java(在最新的版本中,Java 可以不用安装,因为在安装包中已经含有 Java 的安装包)。你可查看 setup 链接得到更多的信息。

安装

  1. 你可以到链接 Download 里去下载 Elasticsearch 最新的发布版。可以参考文档  “Elastic:菜鸟上手指南” 来安装 Elasticsearch
  2. 在Unix/Linux上运行 bin/elasticsearch,或在 Windows 上运行 bin\elasticsearch.bat
  3. 运行curl -X GET http://localhost:9200。你在 Windows 上可以安装 cygwin 来运行 curl 指令
  4. 运行更多的服务器...

使用 cURL命令和 Elasticsearch 对话

我们可以使用 cURL 将请求从命令行提交到本地 Elasticsearch 实例。对 Elasticsearch 的请求包含与任何 HTTP 请求相同的部分:

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

本示例使用以下变量:

  • <VERB> :适当的 HTTP 方法或动词。 例如,GET,POST,PUT,HEAD 或 DELETE
  • <PROTOCOL>:http 或 https。 如果你在 Elasticsearch 前面有一个 HTTPS 代理,或者你使用 Elasticsearch 安全功能来加密HTTP通信,请使用后者
  • <HOST>:Elasticsearch 集群中任何节点的主机名。 或者,将 localhost 用于本地计算机上的节点
  • <PORT>:运行 Elasticsearch HTTP 服务的端口,默认为9200
  • <PATH>:API 端点,可以包含多个组件,例如 _cluster /stats 或 _nodes/stats/jvm
  • <QUERY_STRING>:任何可选的查询字符串参数。 例如,?pretty 将漂亮地打印 JSON 响应以使其更易于阅读
  • <BODY>:JSON 编码的请求正文(如有必要)

如果启用了 Elasticsearch 安全功能,则还必须提供有权运行 API 的有效用户名(和密码)。 例如,使用 -u 或 --u cUR L命令参数。比如:

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

这里的 elastic 及 password 代表用户名及密码。

 

检查 Elastic 是否正确安装好

如果您对 Postman 比较熟悉,请参阅我的文章 “Elastic:使用Postman来访问Elastic Stack” 来做如下的练习。

在我们的terminal上我们可以打人如下的命令:

$ curl -XGET 'http://localhost:9200/' -H 'Content-Type: application/json'

如果你看到如下的内容,表面我们的 elasticsearch 已经安装正确:

以后我们可以安装 Elastic 所提供的安全插件,那么我们可以通过如下的命令来做这个:

$ curl -XGET -u "elastic:changeme" 'http://localhost:9200/' -H 'Content-Type: application/json'

这里 -u 选项可以帮我们设置用户名及密码来登录我们的 elasticsearch。在以后的章节里我们会介绍如何安装并使用安全的插件。


建立索引(Index)

让我们尝试索引一些类似于 Twitter 的信息。 首先,让我们索引一些推文(将自动创建twitter索引):

curl -XPUT 'http://localhost:9200/twitter/_doc/1?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}'

curl -XPUT 'http://localhost:9200/twitter/_doc/2?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T14:12:12",
    "message": "Another tweet, will it be indexed?"
}'

curl -XPUT 'http://localhost:9200/twitter/_doc/3?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "elastic",
    "post_date": "2010-01-15T01:46:38",
    "message": "Building the site, should be kewl"
}'

现在,让我们检查一下上面的信息是否已经通过我上面的操作加入到索引里。我们可以通过GET来查询:

curl -XGET 'http://localhost:9200/twitter/_doc/1?pretty=true'
curl -XGET 'http://localhost:9200/twitter/_doc/2?pretty=true'
curl -XGET 'http://localhost:9200/twitter/_doc/3?pretty=true'

搜索

让我们找到 kimchy 发布的所有推文:

curl -XGET 'http://localhost:9200/twitter/_search?q=user:kimchy&pretty=true'

我们还可以使用 Elasticsearch 提供的 JSON 查询语言而不是查询字符串:

curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match" : { "user": "kimchy" }
    }
}'

上面的查询将会显示所有的由 kimchy 发布的所有 tweet。为了好玩,让我们来得到所有的存储的文档(document) (我们可以看到由用户 elastic 发布的所有的 tweet).

curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match_all" : {}
    }
}'

我们也可以做一个范围里的搜索(刚才上面的那个 post_dat e在建立索引的时候已经自动被识别为 date 类型)

curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "range" : {
            "post_date" : { "from" : "2009-11-15T13:00:00", "to" : "2009-11-15T14:00:00" }
        }
    }
}'

还有更多的选项可以执行搜索,毕竟,这是一个搜索产品吗? 所有熟悉的 Lucene 查询都可以通过 JSON 查询语言或查询解析器获得。

 

多租户 - 索引和类型

伙计,那个 twitter 索引可能会变大(在这种情况下,索引大小==估值)。 让我们看看我们是否可以稍微改变我们的 tweet 系统,以支持如此大量的数据。

Elasticsearch 支持多个索引。 在前面的示例中,我们使用了一个名为 twitter 的索引,该索引为每个用户存储了推文。

定义我们简单的推特系统的另一种方法是为每个用户提供不同的索引(注意,尽管每个索引都有开销)。 这是这种情况下的索引curl:

curl -XPUT 'http://localhost:9200/kimchy/_doc/1?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}'

curl -XPUT 'http://localhost:9200/kimchy/_doc/2?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T14:12:12",
    "message": "Another tweet, will it be indexed?"
}'

以上将索引信息到 kimchy 索引中。 每个用户都将获得自己的特殊索引。

允许完全控制索引级别。 例如,在上面的情况中,我们可能希望从每个索引1个副本的默认1分片更改为每个索引1个副本的2个分片(因为此用户推文很多)。 以下是如何做到这一点(配置也可以是在 yaml 文件里配置):

curl -XPUT http://localhost:9200/another_user?pretty -H 'Content-Type: application/json' -d '
{
    "settings" : {
        "index.number_of_shards" : 2,
        "index.number_of_replicas" : 1
    }
}'

搜索(和类似操作)具有多索引感知功能。 这意味着我们可以轻松搜索多个 index(twitter用户),例如:

curl -XGET 'http://localhost:9200/kimchy,another_user/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match_all" : {}
    }
}'

或者在所有的索引(index)里进行搜索:

curl -XGET 'http://localhost:9200/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match_all" : {}
    }
}'

{One liner teaser}:关于那个很酷的部分? 您可以轻松搜索多个 Twitter 用户(索引),每个用户具有不同的提升级别(索引),使社交搜索变得更加简单(我朋友的结果排名高于我朋友的朋友的结果)。

 

分布式,高度可用

Elasticsearch 是一个高度可用的分布式搜索引擎。每个索引都分解为碎片,每个碎片可以有一个或多个副本。默认情况下,创建一个索引,每个分片有1个分片和1个副本(1/1)。可以使用许多拓扑,包括1/10(提高搜索性能)或20/1(提高索引性能)。

为了使用 Elasticsearch 的分布式特性,只需启动更多节点并关闭节点。系统将继续为索引的最新数据提供请求(确保使用正确的http端口)。

 

我们将从哪里开始呢?


我们刚刚介绍了 Elasticsearch 的一小部分内容。有关更多信息,请参阅 elastic.co 网站。一般问题可以在 elastic论坛 上或在#elasticsearch 的 Freenode 上的 IRC 上询问。 Elasticsearch GitHub 存储库仅用于错误报告和功能请求。

 

从 Source 构建

Elasticsearch 使用 Gradle 作为其构建系统。

要创建分发,只需在克隆目录中运行 ./gradlew 汇编命令。

将在该项目的 build/distributions 目录下创建每个项目的分发。

有关运行 Elasticsearch 测试套件的更多信息,请参阅 TESTING 文件。

 

从旧的 Elasticsearch 版本升级

为了确保从早期版本的 Elasticsearch 顺利升级过程,请参阅我们的升级文档以获取有关升级过程的更多详细信息。
 

下一步

如果您很很想使用 Elastic 的 Kibana 来进行进行 Index 的操作,请参阅我的文章: