elasticsearch深入介绍


elasticsearch是分布式,REST风格,搜索和分析系统。具有实时数据,实时分析,分布式,高可用性,多租户,全文搜索,面向文档,冲突管理,自由模式,rest风格API,每个操作的持久性,Apache 2的开源许可证,基于Apache Lucene之上的特点。

实时数据

数据流进入的系统后,问题就是,数据怎么能够快速的可视化。用elasticsearch,实时展现当前的数据。
real-time-data

实时分析

搜索不仅是自由文本搜索, 它是关于研究您的数据。了解它,获得的见解,这将使您的企业更好或提高您的产品。
real-time-analytics

分布式

elasticsearch允许你开始时候容量比较小,但是随着你商业的增长,它是建立在横向扩展的开箱即用。当你需要更多的容量,只需添加更多的节点,并让集群重组,只需要增加额外的硬件,保护了你以前的硬件投入。

高可用性

Elasticsearch集群是弹性的–它们将自动检测和删除失败的节点,并重新组织自己,以确保您的数据安全和访问。
available

多租户

集群可以托管多个索引,可独立或作为一个组进行查询。索引别名允许你在悬挂时添加索引,对你的应用程序透明。
关于多组户可以看:多租户技术
multi-tenancy1

全文搜索

Elasticsearch在后台使用Lucene来提供最强大的全文检索,提供任何开源产品的能力。搜索自带的多语言支持,强大的查询语言,地理位置支持,上下文感知的建议,自动完成和搜索片段。
search

面向文档

存储复杂真实世界的记录在elasticsearch中用结构化json文档。所有字段被存储,在默认上。所有的索引可以被用作一个单一查询,以非常快的速度返回结果。

冲突管理

开放式版本控制可以用在需要的地方。多进程的冲突改变,开放式版本控制可以确保数据永远不会丢失。
conflict

自由模式

Elasticsearch让你很容易上手。给一个json文档,它将自动检测数据结构,索引数据,可以使它搜索到。后来,你应该用特定领域的知识来自定义你的数据如何来索引。
schema

rest风格api

elasticsearch是API驱动。你可以使用简单rest风格api基于http之上的json来做任何事。你可以选择一个已有API语言来使用elasticsearch。
api

每个操作持久化

elasticsearch首先把你的数据安全放在第一位。在多个节点集群里,文档改变被记录在transaction logs,以尽量减少任何数据丢失的几率。
persistence

Apache 2的开源许可证

Elasticsearch可以下载,使用和免费修改。它是基于Apache 2的开源许可证,它是市面上最灵活的开源许可证。
apache2

基于Apache Lucene之上

Apache Lucene是一个用Java编写的高性能,功能齐全信息检索库。elasticsearch内部利用lucene来构建的分布式和分析功能。
lucene-logo

参考文章:what is elasticsearch?

 

 






简介

ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例。像Solr4一样,是基于Lucene构建的。支持时间时间索引和全文检索。官网: http://www.elasticsearch.org

它对外提供一系列基于 JAVA 和 HTTP 的 API,用于索引、检索、修改大多数配置。

写这篇博客的的主要原因是ElasticSearch的网站只有一些简单的介绍,质量不高,缺少完整的教程。我费了好大劲才把它启动起来,做了一些比hello world更复杂一些的工作。我希望通过分享我的一些经验来帮助对ElasticSearch(很强大的哦)感兴趣的人在初次使用它的时候能够节省些时间。学完这篇教程,你就掌握了它的基本操作——启动、运行。我将从我的电脑上分享这个链接。

现在开始体验

  1. 假设你已经安装了 Java;
  2. 下载 ElasticSearch 。然后,由于关于在Linux与其他非 Wdindows 系统环境里操作它的谈论有许多,这里会更加关心 Windows 7 的桌面环境。请对应选择安装包裹。对 Windows - 一Zip文件 - 用户可解压缩到C:\elasticsearch-0.90.3. 牢记,这十分的不同于安装Eclipse IDE。
  3. 由于不熟悉curl跟cygwin,而且打算节省掌握时间(此多数在官网ElasticSearch.org应用的命令面对非 Windows平台)。读者可以在 http://curl.haxx.se/download.html 和 http://cygwin.com/install.html 安装Curl和cygwin。

测试一下已经完成的工作:

  1. Windows 7 环境中,运行命令行,进入 cd C:\elasticsearch-0.90.3\bin 目录。
  2. 这时运行 elasticsearch.bat
  3. 上面在本机启动了一个ElasticSearch节点。 读者会看到下面的记录提示。(如果您机器上的情况明显不一样,请读者们不要忧愁,因那作者有些个Elastic Search的插件程序,而且我机器上的节点命名和其它会不同读者机器的) 
    请输入图片描述
  4. 现在在浏览器里测试一下 
    请输入图片描述 
    请输入图片描述 
    如果你得到的status是200那它意味着所有的事情都ok啦...是不是很简单? 
    让我们看看JSON的每个字段代表的含义: 
    Ok:当为true时,意味着请求成功。 
    Status:发出请求后的HTTP的错误代码。200表示一切正常。 
    Name:我们Elasticsearch实例的名字。在默认情况下,它将从一个巨长的名字列表中随机选择一个。 
    Version:这个对象有一个number字段,代表了当前运行的Elasticsearch版本号,和一个Snapshot_build字段,代表了你当前运行的版本是否是从源代码构建而来。 
    Tagline:包含了Elasticsearch的第一个tagline: "You Know, for Search."
  5. 现在让我们从 http://mobz.github.io/elasticsearch-head/ 安装ElasticSearch Head插件 
    安装方法非常简单 
    cd C:\elasticsearch-0.90.3\bin plugin -install mobz/elasticsearch-head
    上面的命令会把 elasticsearch-head插件装到你的环境里

教程样例

我们将要部署一个非常简单的应用--在一个部门里的雇员--这样我们可以把注意力放在功能而不是氧立得复杂性上。总而言之,这篇博文是为了帮助人们开始ElasticSearch入门。 
1)现在打开你的cygwin窗口并且键入命令

1
curl -XPUT 'http://localhost:9200/dept/employee/32'-d'{ "empname": "emp32"}'




dept是一个索引并且索引类型是雇员,此时我们正在输入这个索引类型的第31个id。 
你应该能在cygwin的窗口看到这样的信息: 
请输入图片描述 
让我们看一下这个输出:

1
2
3
========================================================================
  % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 91 100 70 100 21 448 134 --:--:-- --:--:-- --:--:-- 500{"ok":true,"_index":"dept","_type":"employee","_id":"31","_version":1}
========================================================================




和上面的命令一样--让我们输入更多的记录:

1
2
3
4
5
curl -XPUT 'http://localhost:9200/dept/employee/1'-d'{ "empname": "emp1"}'
curl -XPUT 'http://localhost:9200/dept/employee/2'-d'{ "empname": "emp2"}'
...
...
curl -XPUT 'http://localhost:9200/dept/employee/30'-d'{ "empname": "emp30"}'




注意:你要记得增加索引计数器和大括号里empname的值。 
一旦这些工作都完成了--你为ElasticSearch输入了足够多的数据,你就可以开始使用head插件搜索你的数据了。

让我们试试吧!

在浏览器中输入: 
http://localhost:9200/_plugin/head/ 
你会看到这个: 
请输入图片描述 
这里是有关簇使用情况和不同索引信息的概况。我们最近创建的索引在其中,显示为"dept"。 
现在点击Structured Query选项卡 
请输入图片描述 
在Search下来菜单中选择"dept"并点击"Search"按钮。 
这将显示所有记录。

搜索特定条目

让我们来搜索emp1,emp25和emp7。不断点击最右面的"+"来添加更多的搜索项,就像如图显示的那样,之后点击"Search"。确保最左边的选项为"should",其他的选项也应该和图中的保持一致。 
请输入图片描述 
现在你可以继续尝试这个插件了,你可以将其用到你的搜索项目中。 
你可以尝试在我的桌面电脑上运行的该应用: 
http://98.228.230.117:9200/_plugin/head/ 
如果有任何问题和意见请联系我。 
希望这篇文章可以让你快速上手"ElasticSearch"——一个不错的企业级开源搜索产品。









  这里简要概括一下。文中首先介绍了Lucene近实时检索的实现原理,即IndexWriter#getReader方法,可以快速获得更新后的索引。同时更新文档的操作之所以不影响近实时性,是因为更新分成的两个步骤都可以很快执行,第一步删除文档操作是在磁盘上的segment中标记文档被删除(而没有实际删除),第二步新文档直接在内存中的segment上重建索引。也就是通过删除和重建这两步合起来实现索引更新,不论是新来的文档还是更新的文档,都出现在内存中,从而实现了近实时检索。

       然后讨论了Distributed Directory(如Compass、Solr)的缺点,不能并行写等。为了解决这个问题,引入了Partition的概念并讨论了Term Based和Document Based的优缺点。选择了Document Based Partitioning后,再加上Replicated Lucene Shards提高可用性和检索性能。同时用Push Replication代替Pull方式,以支持实时检索和热备份/热恢复。

       后面展示了ElasticSearch添加删除节点,添加删除shard,多租户等实际应用例子。

################################

       上面还有一个很重要的概念没有涉及,就是routing。介绍routing之前需要先了解索引、文档和shard之间的关系。

       每个索引建立时需要指定shard的个数,建好以后不能改变。每篇文档都会被分配到某个特定的shard中去,具体分配方法就是routing。

以下是routing的官方定义


When you index a document, it is stored on a single primary shard. That shard is chosen by hashing the routing value. By default, the routing value is derived from the ID of the document or, if the document has a specified parent document, from the ID of the parent document (to ensure that child and parent documents are stored on the same shard). This value can be overridden by specifying a routing value at index time, or a routing field in the mapping.


       简而言之,routing就是将文档hash到一个特点的primary shard中去,从而避免在primary shards中挨个查找,加快定位速度。这里存在潜在的hash分布不均匀问题,还不清楚ElasticSearch是怎样解决的。

################################

顺便提一下,还有个PPT介绍了ElasticSearch的应用场景

 

elasticsearch.
Big Data, Search, and Analytics

Shay Banon (@kimchy)
https://speakerdeck.com/kimchy/elasticsearch-big-data-search-analytics

 

探讨了shards数量的影响,facet search,alias等等。

################################

附一些名词解释,摘自 http://www.elasticsearch.org/guide/appendix/glossary.html

cluster:

       每个cluster由一个或多个节点组成,它们共享同一个集群名。每个cluster有一个被自动选出的master节点,当该master节点挂掉的时候会被自动替换。

node:

       node是elasticsearch的运行实例。为了测试,多个node可以在同一台服务器上启动,但是通常一个服务器只放一个node。

       系统启动时,node会使用广播(或指定的多播)来发现一个现有的cluster,并且试图加入该cluster。

index:

       index有点像关系型数据库中的“database”,包含不同的type的schema映射。

       一个index是一个逻辑上的命名空间,具有一个或多个primary shards,可以拥有零个或多个replia shards。

shard:

       一个shard是一个单独的lucene实例,是被elasticsearch自动管理的底层工作单元。一个索引是包含primary或replia切片的逻辑命名空间。

       除了需要定义primary shards和replia shards的数量以外,你不需要直接指定使用的shards,你的代码中只关心index就好。

       Elasticsearch在集群中分布所有的shards,并且在添加删除节点时,自动重新分配。

primary shard:

       每个document都存储在一个单独的primary shard中。当为一个document建索引时,首先在primary shard上建立,然后在该primary shard的所有replica shards上面建。

       默认的,每个索引有5个primary shards。你可以通过减少或增加primary shards的数量来伸缩你的索引能够接受的文档数量。

       当索引创建以后,你不能够改变索引中primary shards的数量。

replica shard:

       每个primary shard有零或多个repica shard,replica是primary的拷贝,有两个目的,

       a) 提高恢复能力:当primary挂掉时,replica可以变成primary

       b) 提高性能:get和search请求既可以由primary又可以由replica处理

       默认的,每个primary有一个replica,但一个索引的replica的数量可以动态地调整。replica从不与它的primary在同一个node上启动。

routing:

       当为某个document建立索引的时候,索引存储在某个primary shard上。该shard是通过哈希routing value选出来的。默认的,routing value通过document ID得到,或者当该文档有特定的父文档,从父文档的ID得到(这是为了保证子文档和父文档存储在相同的shard)。

       该value可以在建索引时指定,或者在mapping中通过routing field给定。

  这里简要概括一下。文中首先介绍了Lucene近实时检索的实现原理,即IndexWriter#getReader方法,可以快速获得更新后的索引。同时更新文档的操作之所以不影响近实时性,是因为更新分成的两个步骤都可以很快执行,第一步删除文档操作是在磁盘上的segment中标记文档被删除(而没有实际删除),第二步新文档直接在内存中的segment上重建索引。也就是通过删除和重建这两步合起来实现索引更新,不论是新来的文档还是更新的文档,都出现在内存中,从而实现了近实时检索。

       然后讨论了Distributed Directory(如Compass、Solr)的缺点,不能并行写等。为了解决这个问题,引入了Partition的概念并讨论了Term Based和Document Based的优缺点。选择了Document Based Partitioning后,再加上Replicated Lucene Shards提高可用性和检索性能。同时用Push Replication代替Pull方式,以支持实时检索和热备份/热恢复。

       后面展示了ElasticSearch添加删除节点,添加删除shard,多租户等实际应用例子。

################################

       上面还有一个很重要的概念没有涉及,就是routing。介绍routing之前需要先了解索引、文档和shard之间的关系。

       每个索引建立时需要指定shard的个数,建好以后不能改变。每篇文档都会被分配到某个特定的shard中去,具体分配方法就是routing。

以下是routing的官方定义


When you index a document, it is stored on a single primary shard. That shard is chosen by hashing the routing value. By default, the routing value is derived from the ID of the document or, if the document has a specified parent document, from the ID of the parent document (to ensure that child and parent documents are stored on the same shard).


This value can be overridden by specifying a routing value at index time, or a routing field in the mapping.

       简而言之,routing就是将文档hash到一个特点的primary shard中去,从而避免在primary shards中挨个查找,加快定位速度。这里存在潜在的hash分布不均匀问题,还不清楚ElasticSearch是怎样解决的。

################################

顺便提一下,还有个PPT介绍了ElasticSearch的应用场景

 

elasticsearch.
Big Data, Search, and Analytics

Shay Banon (@kimchy)
https://speakerdeck.com/kimchy/elasticsearch-big-data-search-analytics

 

探讨了shards数量的影响,facet search,alias等等。

################################

附一些名词解释,摘自 http://www.elasticsearch.org/guide/appendix/glossary.html

cluster:

       每个cluster由一个或多个节点组成,它们共享同一个集群名。每个cluster有一个被自动选出的master节点,当该master节点挂掉的时候会被自动替换。

node:

       node是elasticsearch的运行实例。为了测试,多个node可以在同一台服务器上启动,但是通常一个服务器只放一个node。

       系统启动时,node会使用广播(或指定的多播)来发现一个现有的cluster,并且试图加入该cluster。

index:

       index有点像关系型数据库中的“database”,包含不同的type的schema映射。

       一个index是一个逻辑上的命名空间,具有一个或多个primary shards,可以拥有零个或多个replia shards。

shard:

       一个shard是一个单独的lucene实例,是被elasticsearch自动管理的底层工作单元。一个索引是包含primary或replia切片的逻辑命名空间。

       除了需要定义primary shards和replia shards的数量以外,你不需要直接指定使用的shards,你的代码中只关心index就好。

       Elasticsearch在集群中分布所有的shards,并且在添加删除节点时,自动重新分配。

primary shard:

       每个document都存储在一个单独的primary shard中。当为一个document建索引时,首先在primary shard上建立,然后在该primary shard的所有replica shards上面建。

       默认的,每个索引有5个primary shards。你可以通过减少或增加primary shards的数量来伸缩你的索引能够接受的文档数量。

       当索引创建以后,你不能够改变索引中primary shards的数量。

replica shard:

       每个primary shard有零或多个repica shard,replica是primary的拷贝,有两个目的,

       a) 提高恢复能力:当primary挂掉时,replica可以变成primary

       b) 提高性能:get和search请求既可以由primary又可以由replica处理

       默认的,每个primary有一个replica,但一个索引的replica的数量可以动态地调整。replica从不与它的primary在同一个node上启动。

routing:

       当为某个document建立索引的时候,索引存储在某个primary shard上。该shard是通过哈希routing value选出来的。默认的,routing value通过document ID得到,或者当该文档有特定的父文档,从父文档的ID得到(这是为了保证子文档和父文档存储在相同的shard)。

       该value可以在建索引时指定,或者在mapping中通过routing field给定。


原文链接:http://www.sxt.cn/u/324/blog/3802

展开阅读全文

没有更多推荐了,返回首页