Elasticsearch 权威指南中文版.docx
《Elasticsearch 权威指南中文版.docx》由会员分享,可在线阅读,更多相关《Elasticsearch 权威指南中文版.docx(10页珍藏版)》请在冰豆网上搜索。
Elasticsearch权威指南中文版
Elasticsearch权威指南(中文版)
1、入门
Elasticsearch是一个实时分布式搜索和分析引擎。
它让你以前所未有的速度处理大数据成为可能。
它用于全文搜索、结构化搜索、分析以及将这三者混合使用:
维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type)和搜索纠错(did-you-mean)等搜索建议功能。
英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。
StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。
Github使用Elasticsearch检索1300亿行的代码。
但是Elasticsearch不仅用于大型企业,它还让像DataDog以及Klout这样的创业公司将最初的想法变成可扩展的解决方案。
Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。
Elasticsearch所涉及到的每一项技术都不是创新或者革命性的,全文搜索,分析系统以及分布式数据库这些早就已经存在了。
它的革命性在于将这些独立且有用的技术整合成一个一体化的、实时的应用。
它对新用户的门槛很低,当然它也会跟上你技能和需求增长的步伐。
如果你打算看这本书,说明你已经有数据了,但光有数据是不够的,除非你能对这些数据做些什么事情。
很不幸,现在大部分数据库在提取可用知识方面显得异常无能。
的确,它们能够通过时间戳或者精确匹配做过滤,但是它们能够进行全文搜索,处理同义词和根据相关性给文档打分吗?
它们能根据同一份数据生成分析和聚合的结果吗?
最重要的是,它们在没有大量工作进程(线程)的情况下能做到对数据的实时处理吗?
这就是Elasticsearch存在的理由:
Elasticsearch鼓励你浏览并利用你的数据,而不是让它烂在数据库里,因为在数据库里实在太难查询了。
Elasticsearch是你新认识的最好的朋友。
1.1、是什么
为了搜索,你懂的
Elasticsearch是一个基于ApacheLucene(TM)的开源搜索引擎。
无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是,Lucene只是一个库。
想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTfulAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。
不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:
∙分布式的实时文件存储,每个字段都被索引并可被搜索
∙分布式的实时分析搜索引擎
∙可以扩展到上百台服务器,处理PB级结构化或非结构化数据
而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTfulAPI、各种语言的客户端甚至命令行与之交互。
上手Elasticsearch非常容易。
它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。
它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。
Elasticsearch在Apache2license下许可使用,可以免费下载、使用和修改。
随着你对Elasticsearch的理解加深,你可以根据不同的问题领域定制Elasticsearch的高级特性,这一切都是可配置的,并且配置非常灵活。
模糊的历史
多年前,一个叫做ShayBanon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。
在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。
直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。
他发布了他的第一个开源项目,叫做“Compass”。
后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。
然后他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。
第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。
一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功能,不过Elasticsearch将永远开源且对所有人可用。
+
Shay的妻子依旧等待着她的食谱搜索……
1.2、安装
安装Elasticsearch
理解Elasticsearch最好的方式是去运行它,让我们开始吧!
安装Elasticsearch唯一的要求是安装官方新版的Java,地址:
你可以从 elasticsearch.org/download 下载最新版本的Elasticsearch。
curl-L-Ohttp:
//download.elasticsearch.org/PATH/TO/VERSION.zip<1>
unzipelasticsearch-$VERSION.zipcdelasticsearch-$VERSION
1.从 elasticsearch.org/download 获得最新可用的版本号并填入URL中
提示:
在生产环境安装时,除了以上方法,你还可以使用Debian或者RPM安装包,地址在这里:
downloadspage,或者也可以使用官方提供的 Puppetmodule 或者 Chefcookbook。
安装Marvel
Marvel是Elasticsearch的管理和监控工具,在开发环境下免费使用。
它包含了一个叫做Sense的交互式控制台,使用户方便的通过浏览器直接与Elasticsearch进行交互。
Elasticsearch线上文档中的很多示例代码都附带一个ViewinSense的链接。
点击进去,就会在Sense控制台打开相应的实例。
安装Marvel不是必须的,但是它可以通过在你本地Elasticsearch集群中运行示例代码而增加与此书的互动性。
Marvel是一个插件,可在Elasticsearch目录中运行以下命令来下载和安装:
./bin/plugin-ielasticsearch/marvel/latest
你可能想要禁用监控,你可以通过以下命令关闭Marvel:
echo'marvel.agent.enabled:
false'>>./config/elasticsearch.yml
运行Elasticsearch
Elasticsearch已经准备就绪,执行以下命令可在前台启动:
./bin/elasticsearch
如果想在后台以守护进程模式运行,添加-d参数。
打开另一个终端进行测试:
curl'http:
//localhost:
9200/?
pretty'
你能看到以下返回信息:
{
"status":
200,
"name":
"ShrunkenBones",
"version":
{
"number":
"1.4.0",
"lucene_version":
"4.10"
},
"tagline":
"YouKnow,forSearch"
}
这说明你的ELasticsearch集群已经启动并且正常运行,接下来我们可以开始各种实验了。
集群和节点
节点(node)是一个运行着的Elasticsearch实例。
集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当然一个节点也可以组成一个集群。
你最好找一个合适的名字来替代cluster.name的默认值,比如你自己的名字,这样可以防止一个新启动的节点加入到相同网络中的另一个同名的集群中。
你可以通过修改config/目录下的elasticsearch.yml文件,然后重启ELasticsearch来做到这一点。
当Elasticsearch在前台运行,可以使用Ctrl-C快捷键终止,或者你可以调用shutdown API来关闭:
curl-XPOST'http:
//localhost:
9200/_shutdown'
查看Marvel和Sense
如果你安装了Marvel(作为管理和监控的工具),就可以在浏览器里通过以下地址访问它:
http:
//localhost:
9200/_plugin/marvel/
你可以在Marvel中通过点击dashboards,在下拉菜单中访问Sense开发者控制台,或者直接访问以下地址:
http:
//localhost:
9200/_plugin/marvel/sense/
1.3.API
与Elasticsearch交互
如何与Elasticsearch交互取决于你是否使用Java。
JavaAPI
Elasticsearch为Java用户提供了两种内置客户端:
节点客户端(nodeclient):
节点客户端以无数据节点(nonedatanode)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。
传输客户端(Transportclient):
这个更轻量的传输客户端能够发送请求到远程集群。
它自己不加入集群,只是简单转发请求给集群中的节点。
两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(ElasticsearchTransportProtocol)。
集群中的节点之间也通过9300端口进行通信。
如果此端口未开放,你的节点将不能组成集群。
TIP
Java客户端所在的Elasticsearch版本必须与集群中其他节点一致,否则,它们可能互相无法识别。
关于JavaAPI的更多信息请查看相关章节:
JavaAPI
基于HTTP协议,以JSON为数据交互格式的RESTfulAPI
其他所有程序语言都可以使用RESTfulAPI,通过9200端口的与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,事实上,如你所见,你甚至可以通过curl命令与Elasticsearch通信。
NOTE
Elasticsearch官方提供了多种程序语言的客户端——Groovy,Javascript,.NET,PHP,Perl,Python,以及Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到。
向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:
curl-X':
//:
/?
'-d''
∙VERBHTTP方法:
GET, POST, PUT, HEAD, DELETE
∙PROTOCOLhttp或者https协议(只有在Elasticsearch前面有https代理的时候可用)
∙HOSTElasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
∙PORTElasticsearchHTTP服务所在的端口,默认为9200
∙PATHAPI路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
∙QUERY_STRING一些可选的查询请求参数,例如?
pretty参数将使请求返回更加美观易读的JSON数据
∙BODY一个JSON格式的请求主体(如果请求需要的话)
举例说明,为了计算集群中的文档数量,我们可以这样做:
curl-XGET'http:
//localhost:
9200/_count?
pretty'-d'
{
"query":
{
"match_all":
{}
}
}
'
Elasticsearch返回一个类似200OK的HTTP状态码和JSON格式的响应主体(除了HEAD请求)。
上面的请求会得到如下的JSON格式的响应主体:
{
"count":
0,
"_shards":
{
"total":
5,
"successful":
5,
"failed":
0
}
}
我们看不到HTTP头是因为我们没有让curl显示它们,如果要显示,使用curl命令后跟-i参数:
curl-i-XGET'localhost:
9200/'
对于本书的其余部分,我们将简写curl请求中重复的部分,例如主机名和端口,还有curl命令本身。
一个完整的请求形如:
curl-XGET'localhost:
9200/_count?
pretty'-d'
{
"query":
{
"match_all":
{}
}
}'
我们将简写成这样:
GET/_count
{
"query":
{
"match_all":
{}
}
}
事实上,在Sense控制台中也使用了与上面相同的格式。
1.4.文档
面向文档
应用中的对象很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期、地理位置、另一个对象或者数组。
总有一天你会想到把这些对象存储到数据库中。
将这些数据保存到由行和列组成的关系数据库中,就好像是把一个丰富,信息表现力强的对象拆散了放入一个非常大的表格中:
你不得不拆散对象以适应表模式(通常一列表示一个字段),然后又不得不在查询的时候重建它们。
Elasticsearch是面向文档(documentoriented)的,这意味着它可以存储整个对象或文档(document)。
然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。
JSON
ELasticsearch使用Javascript对象符号(JavaScriptObjectNotation),也就是JSON,作为文档序列化格式。
JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
它简洁、简单且容易阅读。
以下使用JSON文档来表示一个用户对象:
{
"email":
"**************",
"first_name":
"John",
"last_name":
"Smith",
"info":
{
"bio":
"Eco-warrioranddefenderoftheweak",
"age":
25,
"interests":
["dolphins","whales"]
},
"join_date":
"2014/05/01"
}
尽管原始的user对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了,在Elasticsearch中将对象转化为JSON并做索引要比在表结构中做相同的事情简单的多。
NOTE
尽管几乎所有的语言都有相应的模块用于将任意数据结构转换为JSON,但每种语言处理细节不同。
具体请查看“serialization”or“marshalling”两个用于处理JSON的模块。
Elasticsearch官方客户端会自动为你序列化和反序列化JSON。