elasticsearch是分布式,REST风格,搜索和分析系统。具有实时数据,实时分析,分布式,高可用性,多租户,全文搜索,面向文档,冲突管理,自由模式,rest风格API,每个操作的持久性,Apache 2的开源许可证,基于Apache Lucene之上的特点。
实时数据
数据流进入的系统后,问题就是,数据怎么能够快速的可视化。用elasticsearch,实时展现当前的数据。
实时分析
搜索不仅是自由文本搜索, 它是关于研究您的数据。了解它,获得的见解,这将使您的企业更好或提高您的产品。
分布式
elasticsearch允许你开始时候容量比较小,但是随着你商业的增长,它是建立在横向扩展的开箱即用。当你需要更多的容量,只需添加更多的节点,并让集群重组,只需要增加额外的硬件,保护了你以前的硬件投入。
高可用性
Elasticsearch集群是弹性的–它们将自动检测和删除失败的节点,并重新组织自己,以确保您的数据安全和访问。
多租户
集群可以托管多个索引,可独立或作为一个组进行查询。索引别名允许你在悬挂时添加索引,对你的应用程序透明。
关于多组户可以看:多租户技术
全文搜索
Elasticsearch在后台使用Lucene来提供最强大的全文检索,提供任何开源产品的能力。搜索自带的多语言支持,强大的查询语言,地理位置支持,上下文感知的建议,自动完成和搜索片段。
面向文档
存储复杂真实世界的记录在elasticsearch中用结构化json文档。所有字段被存储,在默认上。所有的索引可以被用作一个单一查询,以非常快的速度返回结果。
冲突管理
开放式版本控制可以用在需要的地方。多进程的冲突改变,开放式版本控制可以确保数据永远不会丢失。
自由模式
Elasticsearch让你很容易上手。给一个json文档,它将自动检测数据结构,索引数据,可以使它搜索到。后来,你应该用特定领域的知识来自定义你的数据如何来索引。
rest风格api
elasticsearch是API驱动。你可以使用简单rest风格api基于http之上的json来做任何事。你可以选择一个已有API语言来使用elasticsearch。
每个操作持久化
elasticsearch首先把你的数据安全放在第一位。在多个节点集群里,文档改变被记录在transaction logs,以尽量减少任何数据丢失的几率。
Apache 2的开源许可证
Elasticsearch可以下载,使用和免费修改。它是基于Apache 2的开源许可证,它是市面上最灵活的开源许可证。
基于Apache Lucene之上
Apache Lucene是一个用Java编写的高性能,功能齐全信息检索库。elasticsearch内部利用lucene来构建的分布式和分析功能。
简介
ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例。像Solr4一样,是基于Lucene构建的。支持时间时间索引和全文检索。官网: http://www.elasticsearch.org
它对外提供一系列基于 JAVA 和 HTTP 的 API,用于索引、检索、修改大多数配置。
写这篇博客的的主要原因是ElasticSearch的网站只有一些简单的介绍,质量不高,缺少完整的教程。我费了好大劲才把它启动起来,做了一些比hello world更复杂一些的工作。我希望通过分享我的一些经验来帮助对ElasticSearch(很强大的哦)感兴趣的人在初次使用它的时候能够节省些时间。学完这篇教程,你就掌握了它的基本操作——启动、运行。我将从我的电脑上分享这个链接。
现在开始体验
- 假设你已经安装了 Java;
- 下载 ElasticSearch 。然后,由于关于在Linux与其他非 Wdindows 系统环境里操作它的谈论有许多,这里会更加关心 Windows 7 的桌面环境。请对应选择安装包裹。对 Windows - 一Zip文件 - 用户可解压缩到C:\elasticsearch-0.90.3. 牢记,这十分的不同于安装Eclipse IDE。
- 由于不熟悉curl跟cygwin,而且打算节省掌握时间(此多数在官网ElasticSearch.org应用的命令面对非 Windows平台)。读者可以在 http://curl.haxx.se/download.html 和 http://cygwin.com/install.html 安装Curl和cygwin。
测试一下已经完成的工作:
- Windows 7 环境中,运行命令行,进入 cd C:\elasticsearch-0.90.3\bin 目录。
- 这时运行 elasticsearch.bat
- 上面在本机启动了一个ElasticSearch节点。 读者会看到下面的记录提示。(如果您机器上的情况明显不一样,请读者们不要忧愁,因那作者有些个Elastic Search的插件程序,而且我机器上的节点命名和其它会不同读者机器的)
- 现在在浏览器里测试一下
如果你得到的status是200那它意味着所有的事情都ok啦...是不是很简单?
让我们看看JSON的每个字段代表的含义:
Ok:当为true时,意味着请求成功。
Status:发出请求后的HTTP的错误代码。200表示一切正常。
Name:我们Elasticsearch实例的名字。在默认情况下,它将从一个巨长的名字列表中随机选择一个。
Version:这个对象有一个number字段,代表了当前运行的Elasticsearch版本号,和一个Snapshot_build字段,代表了你当前运行的版本是否是从源代码构建而来。
Tagline:包含了Elasticsearch的第一个tagline: "You Know, for Search." - 现在让我们从 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