Elasticsearch 是一个创建在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎,能够说 Lucene 是当今最早进,最高效的全功能开源搜索引擎框架。java
可是 Lucene 只是一个框架,要充分利用它的功能,你须要使用 JAVA,而且在你的程序中集成 Lucene。更糟的是,你须要作不少的学习了解,才能明白它是如何运行的,Lucene 确实很是复杂。git
Elasticsearch 使用 Lucene 做为内部引擎,可是在你使用它作全文搜索时,只须要使用统一开发好的API便可,而并不须要了解其背后复杂的 Lucene 的运行原理。github
固然 Elasticsearch 并不只仅是 Lucene 那么简单,它不只包括了全文搜索功能,还能够进行如下工做:数据库
这么多的功能被集成到一台服务器上,你能够轻松地经过客户端或者任何你喜欢的程序语言与 ES 的 RESTful API 进行交流。apache
Elasticsearch 的上手是很是简单的。它附带了不少很是合理的默认值,这让初学者很好地避免一上手就要面对复杂的理论,它安装好了就可使用了,用很小的学习成本就能够变得颇有生产力。编程
随着学习的深刻,你还可使用 Elasticsearch 更多高级的功能,整个引擎能够很灵活地进行配置。你能够根据自身需求来定制属于你本身的 Elasticsearch。json
yum install java-1.7.0-openjdk -y
了解 Elasticsearch 最简单的方法就是去尽情的玩儿它(汗),准备好了咱们就开始吧。api
安装 Elasticsearch 只有一个要求,就是要安装最新版本的JAVA。你能够到官方网站下载它:www.java.com.数组
你能够在这里下载到最新版本的 Elasticsearch: elasticsearch.org/download.服务器
curl -L -O http://download.elasticsearch.org/PATH/TO/LATEST/$VERSION.zip unzip elasticsearch-$VERSION.zip cd elasticsearch-$VERSION
提示: 当你安装 Elasticsearch 时,你能够到 下载页面 选择Debian或者RP安装包。或者你也可使用官方提供的 Puppet module 或者 Chef cookbook.
Marvel is a management and monitoring tool for Elasticsearch which is free for development use. It comes with an interactive console called Sense which makes it very easy to talk to Elasticsearch directly from your browser.
Many of the code examples in this book include a ``View in Sense'' link. When clicked, it will open up a working example of the code in the Sense console. You do not have to install Marvel, but it will make this book much more interactive by allowing you to experiment with the code samples on your local Elasticsearch cluster.
Marvel is available as a plugin. To download and install it, run this command in the Elasticsearch directory:
./bin/plugin -i elasticsearch/marvel/latest
You probably don't want Marvel to monitor your local cluster, so you can disable data collection with this command:
echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml
Elasticsearch 已经蓄势待发,如今你即可以运行它了:
./bin/elasticsearch
若是你想让它在后台保持运行的话能够在命令后面再加一个 -d
开启后你就可使用另外一个终端窗口来进行测试了:
curl 'http://localhost:9200/?pretty'
你应该看到以下提示:
{
"status": 200, "name": "Shrunken Bones", "version": { "number": "1.4.0", "lucene_version": "4.10" }, "tagline": "You Know, for Search" }
这就说明你的 Elasticsearch 集群 已经上线运行了,这时咱们就能够进行各类实验了。
集群和节点
节点 是 Elasticsearch 运行的实例。集群 是一组有着一样cluster.name
的节点,它们协同工做,互相分享数据,提供了故障转移和扩展的功能。固然一个节点也能够是一个集群。
如何与 Elasticsearch 通讯要取决于你是否使用 JAVA。
若是你使用的是 JAVA,Elasticsearch 内置了两个客户端,你能够在你的代码中使用:
节点客户端: 节点客户端以一个 无数据节点 的身份加入了一个集群。换句话说,它自身是没有任何数据的,可是他知道什么数据在集群中的哪个节点上,而后就能够请求转发到正确的节点上并进行链接。
传输客户端: 更加轻量的传输客户端能够被用来向远程集群发送请求。他并不加入集群自己,而是把请求转发到集群中的节点。
这两个客户端都使用 Elasticsearch 的 传输 协议,经过9300端口与 java 客户端进行通讯。集群中的各个节点也是经过9300端口进行通讯。若是这个端口被禁止了,那么你的节点们将不能组成一个集群。
TIP
Java 的客户端的版本号必需要与 Elasticsearch 节点所用的版本号同样,否则他们之间可能没法识别。
更多关于 Java API 的说明能够在这里找到 Guide.
其余的语言能够经过9200端口与 Elasticsearch 的 RESTful API 进行通讯。事实上,如你所见,你甚至可使用行命令 curl
来与 Elasticsearch 通讯。
Elasticsearch 官方提供了不少种编程语言的客户端,也有和许多社区化软件的集成插件,这些均可以在Guide 里面找到。
向 Elasticsearch 发出的请求和其余全部的 HTTP 请求的组成部分是一致的。例如,计算集群中文件的数量,咱们就可使用:
<1> <2> <3> <4> curl -XGET 'http://localhost:9200/_count?pretty' -d ' { <5> "query": { "match_all": {} } } '
GET
, POST
, PUT
, HEAD
或者 DELETE
。?pretty
就能够生成 更加美观 的JSON反馈,以加强可读性。Elasticsearch 将会返回一个 HTTP 状态码相似于 '200 OK',以及一个 JSON 格式的主体(除了单纯的 'HEAD' 请求),上面的请求会获得下方的 JSON 主体:
{
"count" : 0, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 } }
在反馈中,咱们并无看见 HTTP 的头部信息,由于咱们没有告知 curl
显示这些内容。若是你想看到头部信息,能够在使用 curl
命令的时候再加上 -i
这个参数:
curl -i -XGET 'localhost:9200/'
从如今开始,本书里全部涉及 curl
命令的部分咱们都会进行简写,由于主机、端口等信息都是相同的,缩减前的样子:
curl -XGET 'localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }'
咱们将会简写成这样:
GET /_count
{
"query": { "match_all": {} } }
程序中的对象不多是单纯的键值与数值的列表。更多的时候它拥有一个复杂的结构,好比包含了日期、地理位置、对象、数组等。
早晚你会把这些对象存储在数据库中。你会试图将这些丰富而又庞大的数据都放到一个由行与列组成的关系数据库中,而后你不得不根据每一个字段的格式来调整数据,而后每次重建它你都要检索一遍数据。
Elasticsearch 是 面向文档型数据库,这意味着它存储的是整个对象或者 文档,它不但会存储它们,还会为他们创建索引,这样你就能够搜索他们了。你能够在 Elasticsearch 中索引、搜索、排序和过滤这些文档。不须要成行成列的数据。这将会是彻底不一样的一种面对数据的思考方式,这也是为何 Elasticsearch 能够执行复杂的全文搜索的缘由。
Elasticsearch使用 JSON (或称做JavaScript Object Notation ) 做为文档序列化的格式。JSON 已经被大多数语言支持,也成为 NoSQL 领域的一个标准格式。它简单、简洁、易于阅读。
把这个 JSON 想象成一个用户对象:
{
"email": "john@smith.com", "first_name": "John", "last_name": "Smith", "about": { "bio": "Eco-warrior and defender of the weak", "age": 25, "interests": [ "dolphins", "whales" ] }, "join_date": "2014/05/01", }
虽然 user
这个对象很是复杂,可是它的结构和含义都被保留到 JSON 中了。在 Elasticsearch 中,将对象转换为 JSON 并做为索引要比在表结构中作相同的事情简单多了。
将你的数据转换为 JSON
几乎全部的语言都有将任意数据转换、机构化成 JSON,或者将对象转换为JSON的模块。查看 serialization
以及marshalling
两个 JSON 模块。The official Elasticsearch clients 也能够帮你自动结构化 JSON。
为了能让你感觉一下 Elasticsearch 能作什么以及它是有多么的易用,咱们会先为你简单展现一下,其中包括了基本的 建立索引,搜索 以及 聚合。
咱们会在这里向你介绍一些新的术语以及简单的概念,即便你没有立刻接受这些概念也没有关系。咱们会在以后的章节中逐渐帮你理解它们。
因此,准备开始享受 Elasticsearch 的学习之旅把!
想象咱们正在为一个名叫 megacorp 的公司的 HR 部门制做一个新的员工名单系统,这些名单应该能够知足实时协同工做,因此它应该能够知足如下要求:
这个项目的第一步就是存储员工的数据。这样你就须要一个“员工档案”的表单,这样每一个文档都表明着一个员工。在 Elasticsearch 中,存储数据的行为就叫作 索引(indexing) ,可是在咱们索引数据前,咱们须要决定将数据存储在哪里。
在 Elasticsearch 中,文档属于一种 类型(type),各类各样的类型存在于一个 索引 中。你也能够经过类比传统的关系数据库获得一些大体的类似之处:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)
一个 Elasticsearch 集群能够包含多个 索引(数据库),也就是说其中包含了不少 类型(表)。这些类型中包含了不少的 文档(行),而后每一个文档中又包含了不少的 字段(列)。
索引 索引 索引
你可能发如今 Elasticsearch 中,索引这个词汇已经被赋予了太多意义,因此在这里咱们有必要澄清一下:
索引 (名词)
如上文所说,一个 索引 就相似于传统关系型数据库中的 数据库。这里就是存储相关文档的的地方。
索引 (动词)
为一个文档建立索引 是把一个文档存储到一个索引(名词)中的过程,这样它才能被检索。这个过程很是相似于 SQL 中的 INSERT
命令,若是已经存在文档,新的文档将会覆盖旧的文档。
反向索引
在关系数据库中的某列添加一个 索引,好比多路搜索树(B-Tree)索引,就能够加速数据的取回速度, Elasticsearch 以及 Lucene 使用的是一个叫作 反向索引(inverted index) 的结构来实现相同的功能。
一般,每一个文档中的字段都被建立了索引(拥有一个反向索引),所以他们能够被搜索。若是一个字段缺失了反向索引的话,它将不能被搜索。咱们将会在以后的《反向索引》章节中详细介绍它。
因此为了建立员工名单,咱们须要进行以下操做:
employee
类型。megacorp
这个 索引 中。在实际的操做中,这些操做是很是简单的(即便看起来有这么多步骤)。咱们能够把如此之多的操做经过一个命令来完成:
PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }
注意在 /megacorp/employee/1
路径下,包含了三个部分:
名字 | 内容 |
---|---|
megacorp | 索引的名字 |
employee | 类型的名字 |
1 | 当前员工的ID |
请求部分,也就是 JSON 文档,在这里包含了关于这名员工的全部信息。他的名字是 “John Smith”,他已经25岁了,他很喜欢攀岩。
怎么样?很简单吧!咱们在操做前不须要进行任何管理操做,好比建立索引,或者为字段指定数据的类型。咱们就这么直接地为一个文档建立了索引。Elasticsearch 会在建立的时候为它们设定默认值,因此全部管理操做已经在后台被默默地完成了。
在进行下一步以前,咱们再为这个目录添加更多的员工信息吧:
PUT /megacorp/employee/2 { "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests": [ "music" ] } PUT /megacorp/employee/3 { "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about": "I like to build cabinets", "interests": [ "forestry" ] }