:Elasticsearch服务器开发库赛,罗格辛斯基,蔡建斌 pdf下载pdf下载

:Elasticsearch服务器开发库赛,罗格辛斯基,蔡建斌百度网盘pdf下载

作者:
简介:本篇提供书籍《:Elasticsearch服务器开发库赛,罗格辛斯基,蔡建斌》百度网盘pdf下载
出版社:万泽惠远图书专营店
出版时间:2015-03
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍

基本信息

书名:Elasticsearch服务器开发(第2版)

定价:59.0元

作者:(波)库赛,罗格辛斯基,蔡建斌

出版社:人民邮电出版社

出版日期:2015-03-01

ISBN:9787115380326

字数:

页码:

版次:2

装帧:平装

开本:16开

商品重量:0.4kg

编辑推荐


  Elasticsearch是基于Lucene的新一代分布式、RESTful风格的开源搜索引擎,具有实时搜索、稳定、快速、安装使用方便等优点。Elasticsearch在全球拥有众多知名用户:GitHub使用Elasticsearch搜索20 TB的数据——包括13亿文件和1300亿行代码,有“音频分享界YouTube”之称的SoundCloud使用Elasticsearch为1.8亿会员在线即时提供音频搜索结果,德国商务社交网站Xing使用Elasticsearch为1400万会员提供可扩展、实时的搜索,手机服务网站Foursquare使用Elasticsearch实时搜索5000万个地点,浏览器插件StumbleUpon利用Elasticsearch每天向它们的社区发送数百万条推荐。

内容提要


  本书介绍了Elasticsearch这个的全文检索和分析引擎从安装和配置到集群管理的各方面知识。本书这一版不仅补充了上一版中遗漏的重要内容,并且所有示例和功能均基于Elasticsearch服务器1.0版进行了更新。你可以从头开始循序渐进地学习本书,也可以查阅具体功能解决手头问题。

目录


作者介绍



  Rafa Ku
  ?
  solr.pl网站联合创始人,现为Sematext集团顾问和软件工程师,专注于Apache Lucene、Solr、Elasticsearch和Hadoop等开源技术。Rafa拥有超过12年的多领域软件经验,其中既包括银行软件又包括电子商务产品。Rafa也是Apache Solr 3.1 Cookbook等技术图书的作者,并且一直是Lucene Eurocon、Berlin Buzzwords、ApacheCon和Lucene Revolution等会议的演讲嘉宾。
  Marek Rogoziński
  solr.pl网站联合创始人,拥有10年以上的软件架构师和顾问从业经验,专门研究基于Solr和Elasticsearch等开源搜索引擎的解决方案,以及Hadoop、HBase和Twitter Storm等用于大数据分析的软件。
  译者简介:
  蔡建斌
  敏捷践行者,擅长Scrum/XP/Kanban等敏捷实践,现在英孚教育全球研发中心任Technical Lead,除了50%时间写代码以外,业务需求分析、前后端架构设计、性能调优、自动化测试、流程改进、发布运维、代码评审无所不为,只为开发出更好的软件。爱好围棋,弈城4段5段之间跳跃。目标:工作上有所不为;爱好上添加一项健身。E:caijianbin93@126.。


文摘


  Elasticsearch集群入门
  欢迎来到Elasticsearch的奇妙世界,它是的全文检索和分析引擎。不管你对Elasticsearch和全文检索有没有经验,都不要紧。我们希望你可以通过这本书,学习并扩展Elasticsearch的知识。由于这本书也是为初学者准备的,我们决定先简单介绍一般性的全文检索概念,接着再简要概述Elasticsearch。
  我们要做的件事就是安装Elasticsearch。与许多应用相同,你从安装和配置着手,并经常忘记这些步骤的重要性。我们会尽量引导你完成这些步骤,从而使你更容易记住要点。此外,我们将告诉你如何用简单的方法来索引和检索数据,而不用陷入太多细节。读完本章,你将学到以下内容:
  全文检索;
  了解Apache Lucene;
  文本分析;
  学习Elasticsearch的基本概念;
  安装和配置Elasticsearch;
  使用Elasticsearch REST API来操纵数据;
  使用基本的URI请求来搜索。
  1.1 全文检索
  在全文检索只为一小部分工程师所知的时代,我们大多数人使用SQL数据库来执行搜索操作。当然它至少在程度上没什么问题。然而,当你越钻越深,就会看到这种方法的局限,如缺乏扩展性、不够灵活、缺乏语言分析(当然SQL数据库的全文检索对此有所作为)等。于是Apache Lucene(lucene.apache.org)出现了,它的目标是提供一个全文检索的功能库。它非常快速,可扩展,并提供不同语言的分析能力。
  1.1.1 Lucene词汇表和架构
  深入介绍分析处理的细节之前,我们先介绍一下Apache Lucene的词汇表和整体架构,是这个库的基本概念。
  文档(document):索引和搜索时使用的主要数据载体,包含一个或多个存有数据的字段。
  字段(field):文档的一部分,包含名称和值两部分。
  词(term):一个搜索单元,表示文本中的一个词。
  标记(token):表示在字段文本中出现的词,由这个词的文本、开始和结束偏移量以及类型组成。
  Apache Lucene将所有信息写到一个称为倒排索引(inverted index)的结构中。不同于关系型数据库中表的处理方式,倒排索引建立索引中词和文档之间的映射。你可以把倒排索引看成这样一种数据结构,其中的数据是面向词而不是面向文档的。来看一个简单的例子。我们有一些文档,只有它们的标题字段需要被索引,它们看起来如下所示:
  Elasticsearch Server 1.0 (document 1);
  Mastering Elasticsearch (document 2);
  Apache Solr 4 Cookbook (document 3)。
  那么,简化版的索引可以看成是这样的:
  词计  数文  档
  1.01
  41
  Apache1
  Cookbook1
  Elasticsearch2,
  Mastering1
  Server1
  Solr1
  每一个词指向包含它的文档编号。这样就可以执行一种非常高效且快速的搜索,比如基于词的查询。此外,每个词有一个计数,告诉Lucene该词出现的频率。
  当然,Lucene实际创建的索引要比这个复杂得多,也先进得多,它创建的额外文件包含了词向量(term vector)、文档值(doc value)等信息。然而,到现在为止,你需要知道的是数据怎么组织,而不是具体怎么存储。
  每个索引分为多个“写一次,读多次”(write once and read many time)的段(segment)。建立索引时,一个段写入磁盘后就不能再更新。因此,被删除文档的信息存储在一个单独的文件中,但该段自身不被更新。
  然而,多个段可以通过段合并(segments merge)合并在一起。当强制段合并或者Lucene决定合并时,这些小段就会由Lucene合并成更大的一些段。合并需要I/O。然而一些信息需要清除,因为在合并时,不再需要的信息将被删除(例如,被删除的文档)。除此之外,检索大段比检索存有相同数据的多个小段速度更快。这是因为在一般情况下,搜索只需将查询词与那些被编入索引的词相匹配。通过多个小段寻找和合并结果,显然会比让一个大段直接提供结果慢得多。
  1.1.2 输入数据分析
  当然,问题是,传入文档中的数据怎样转化成倒排索引,查询文本怎样变成可被搜索的词?这个数据转化的过程被称为分析。你可能希望某些字段经语言分析器处理,使得car和cars在索引中被视为同一个。另外,你可能希望另一些字段只用空格或者小写划分。
  分析的工作由分析器完成,它由一个分词器(tokenizer)和零个或多个标记过滤器(token filter)组成,也可以有零个或多个字符映射器(character mapper)。
  Lucene中的分词器把文本分割成多个标记,基本就是词加上一些额外信息,比如该词在原始文本中的位置和长度。分词器的处理结果称为标记流(token stream),它是一个接一个的标记,准备被过滤器处理。
  除了分词器,Lucene分析器包含零个或多个标记过滤器,用来处理标记流中的标记。是一些过滤器的例子。
  小写过滤器(lowercase filter):把所有的标记变成小写。
  同义词过滤器(synonyms filter):基于基本的同义词规则,把一个标记换成另一个同义的标记。
  多语言词干提取过滤器(multiple language stemming filter):减少标记(实际上是标记中的文本部分),得到词根或者基本形式,即词干。
  过滤器是一个接一个处理的。所以我们通过使用多个过滤器,几乎可以达到无限的分析可能性。
  后,字符映射器对未经分析的文本起作用,它们在分词器之前工作。因此,我们可以很容易地从文本的整体部分去除HTML标签而无需担心它们被标记。
  索引和查询
  我们可能想知道当使用Lucene和所有建立在它之上的软件时,上述所有功能对索引和查询的影响。建立索引时,Lucene会使用你选择的分析器来处理你的文档内容。当然,不同的字段可以使用不同的分析器,所以文档的名称字段可以和汇总字段做不同的分析。如果我们愿意,也可以不分析字段。
  查询时,查询将被分析。但是,你也可以选择不分析。记住这一点很关键,因为一些Elasticsearch查询被分析,一些则不然。例如,前缀和词查询不被分析,匹配查询则被分析。可以在被分析查询和不被分析查询两者中选择非常有用。有时,你可能希望查询一个未经分析的字段,而有时你则希望有全文搜索的分析。如果我们查询LightRed这个词,标准分析器分析这个查询后,会去查询light和red;如果我们使用不经分析的查询类型,则会明确地查询LightRed这个词。
  关于索引和查询分析,你应该记住的是,索引应该和查询词匹配。如果它们不匹配,Lucene不会返回所需文档。比如,你在建立索引时使用了词干提取和小写,那你应该保证查询中的词也必须是词干和小写,否则你的查询不会返回任何结果。重要的是在索引和查询分析时,对所用标记过滤器保持相同的顺序,这样被分析出来的词是一样的。
  1.1.3 评分和查询相关性
  另外还有件现在还没提到的事,就是评分(scoring)。什么是文档的得分?得分是根据文档和查询的匹配度用计分公式计算的结果。默认情况下,Apache Lucene使用TF/IDF(term frequency/inverse document frequency,词频/逆向文档频率)评分机制,这是一种计算文档在我们查询上下文中相关度的算法。当然,它不是可用的算法,2.2节将介绍其他算法。
  如果你想阅读更多关于Apache Lucene TF/IDF评分公式的内容,请访问Apache Lucene Javadocs中的TFIDFSimilarity类,网址:lucene.apache.org/core/4_6_0/ core/org/apache/lucene/search/similarities/TFIDFSimilarity.。
  请记住,Elasticsearch和Lucene计算的分数值越高,意味着文档越相关。一些参数(比如boost)、不同的查询类型(3.3节将讨论这些查询类型)、不同的评分算法,都会影响得分的计算。
  如果您想更深入地了解Apache Lucene评分是如何工作的、默认算法是什么、分数是如何计算的,请参阅我们的书Mastering ElasticSearch,Packt出版。
  1.2 Elasticsearch基础
  Elasticsearch是由Shay Banon发起的一个开源搜索服务器项目,2010年2月发布。迄今,该项目已发展成为搜索和数据分析解决方案领域的主要一员,广泛应用于声名卓著或鲜为人知的搜索应用程序。此外,由于其分布式性质和实时功能,许多人把它作为文档数据库。
  1.2.1 数据架构的主要概念
  让我们过一遍Elasticsearch的基本概念。如果你已经熟悉Elasticsearch架构,可以跳过本节。如果你不熟悉这种架构,请考虑阅读本节。我们将提到本书其余部分会用到的关键字。
  1. 索引
  索引(index)是Elasticsearch对逻辑数据的逻辑存储,所以它可以分为更小的部分。你可以把索引看成关系型数据库的表。然而,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。如果你知道MongoDB,可以把Elasticsearch的索引看成MongoDB里的一个集合。如果你熟悉CouchDB,可以把索引看成CouchDB数据库索引。Elasticsearch可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片(shard),每个分片可以有多个副本(replica)。
  2. 文档
  存储在Elasticsearch中的主要实体叫文档(document)。用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。当比较Elasticsearch中的文档和MongoDB中的文档,你会发现两者都可以有不同的结构,但Elasticsearch的文档中,相同字段必须有相同类型。这意味着,所有包含title字段的文档,title字段类型都必须一样,比如string。
  文档由多个字段组成,每个字段可能多次出现在一个文档里,这样的字段叫多值字段(multivalued)。每个字段有类型,如文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。字段类型在Elasticsearch中很重要,因为它给出了各种操作(如分析或排序)如何被执行的信息。幸好,这可以自动确定,然而,我们仍然建议使用映射。与关系型数据库不同,文档不需要有固定的结构,每个文档可以有不同的字段,此外,在程序开发期间,不必确定有哪些字段。当然,可以用模式强行规定文档结构。从客户端的角度看,文档是一个JSON对象(关于JSON格式的更多内容,参见en.wikipedia.org/wiki/JSON)。每个文档存储在一个索引中并有一个Elasticsearch自动生成的标识符和文档类型。文档需要有对应文档类型的标识符,这意味着在一个索引中,两个不同类型的文档可以有相同的标识符。
  3. 文档类型
  在Elasticsearch中,一个索引对象可以存储很多不同用途的对象。例如,一个博客应用程序可以保存文章和评论。文档类型让我们轻易地区分单个索引中的不同对象。每个文档可以有不同的结构,但在实际部署中,将文件按类型区分对数据操作有很大帮助。当然,需要记住一个限制,不同的文档类型不能为相同的属性设置不同的类型。例如,在同一索引中的所有文档类型中,一个叫title的字段必须具有相同的类型。
  4. 映射
  在有关全文搜索基础知识部分,我们提到了分析的过程:为建索引和搜索准备输入文本。文档中的每个字段都必须根据不同类型做相应的分析。举例来说,对数值字段和从网页抓取的文本字段有不同的分析,比如前者的数字不应该按字母顺序排序,后者的步是忽略HTML标签,因为它们是无用的信息噪音。Elasticsearch在映射中存储有关字段的信息。每一个文档类型都有自己的映射,即使我们没有明确定义。
  1.2.2 Elasticsearch主要概念
  现在,我们已经知道Elasticsearch把数据存储在一个或多个索引上,每个索引包含各种类型的文档。我们也知道了每个文档有很多字段,映射定义了Elasticsearch如何对待这些字段。但还有更多,从一开始,Elasticsearch就被设计为能处理数以亿计的文档和每秒数以百计的搜索请求的分布式解决方案。这归功于几个重要的概念,我们现在将更详细地描述。
  1. 节点和集群
  Elasticsearch可以作为一个独立的单个搜索服务器。不过,为了能够处理大型数据集,实现容错和高可用性,Elasticsearch可以运行在许多互相合作的服务器上。这些服务器称为集群(cluster),形成集群的每个服务器称为节点(node)。
  2. 分片
  当有大量的文档时,由于内存的限制、硬盘能力、处理能力不足、无法足够快地响应客户端请求等,一个节点可能不够。在这种情况下,数据可以分为较小的称为分片(shard)的部分(其中每个分片都是一个独立的Apache Lucene索引)。每个分片可以放在不同的服务器上,因此,数据可以在集群的节点中传播。当你查询的索引分布在多个分片上时,Elasticsearch会把查询发送给每个相关的分片,并将结果合并在一起,而应用程序并不知道分片的存在。此外,多个分片可以加快索引。
  3. 副本
  为了提高查询吞吐量或实现高可用性,可以使用分片副本。副本(replica)只是一个分片的,每个分片可以有零个或多个副本。换句话说,Elasticsearch可以有许多相同的分片,其中之一被自动选择去更改索引操作。这种特殊的分片称为主分片(primary shard),其余称为副本分片(replica shard)。在主分片丢失时,例如该分片数据所在服务器不可用,集群将副本提升为新的主分片。
  4. 时光之门
  Elasticsearch处理许多节点。集群的状态由时光之门控制。默认情况下,每个节点都在本地存储这些信息,并且在节点中同步。我们将在7.2节详细讨论时光之门模块。
  1.2.3 索引建立和搜索
  你可能会问实际上如何把所有的索引、分片和副本绑在单个环境里。理论上,当你必须知道你的文档在哪,哪台服务器、哪个分片上时,从集群获取数据非常困难。更为困难的是当一个搜索需要返回的文档分布在集群中不同节点的不同分片上时。这确实是一个复杂的问题,好在我们不需要关心,它由Elasticsearch本身自动处理。来看看下图:
  发送一个新的文档给集群时,你指定一个目标索引并发送给它的任意一个节点。这个节点知道目标索引有多少分片,并且能够确定哪个分片应该用来存储你的文档。可以更改Elasticsearch的这个行为。2.6.3节将对此进行讨论。现在你需要记住的重要信息是,Elasticsearch使用文档的标识符来计算文档应该被放到哪个分片中。索引请求发送到一个节点后,该节点会转发文档到持有相关分片的目标节点中。
  现在来看看关于执行搜索请求的图:
  尝试用文档标识符来获取文档时,发送查询到一个节点,该节点使用同样的路由算法来决定持有文档的节点和分片,然后转发查询,获取结果,并把结果发送给你。另一方面,查询过程更为复杂。除非使用了路由,查询将直接转发到单个分片,否则,收到查询请求的节点会把查询转发给保存了属于给定索引的分片的所有节点,并要求与查询匹配的文档的少信息(默认情况下是标识符和得分)。这个过程称为发散阶段(scatter phase)。收到这些信息后,该聚合节点(收到客户端请求的节点)对结果排序,并发送第2个请求来获取结果列表所需的文档(除了标识符和得分以外的所有信息)。这个阶段称为收集阶段(gather phase)。这个阶段执行完毕后,结果返回到客户端。
  现在问题来了,在前面描述的过程中,副本扮演了什么角色呢?在建立索引时,副本只作为额外的位置来存储数据。当执行查询时,默认情况下,Elasticsearch会尽量平衡分片和它的副本之间的负载,使它们承受均衡的压力。此外,记住我们可以改变该行为。3.2节将对此进行讨论。
  1.3 安装并配置集群
  有几个安装Elasticsearch所需的步骤,接下来几节将详细说明。
  1.3.1 安装Java
  为了建立Elasticsearch,步是确保正确安装Java SE环境。Elasticsearch需要Java 6或更高版本。你可以从.oracle./techwork/java/javase/downloads/index.下载。如果你想,也可以使用OpenK(openk.java./)。当然你可以使用Java 6,但它已经没有补丁的支持,所以建议安装Java 7。
  1.3.2 安装Elasticsearch
  从.elasticsearch.org/download/下载,解压。选择新的稳定版本,安装完毕。
  写这本书时,我们用的是Elasticsearch 1.0.0 GA。这意味着,我们已经跳过一些被标记为过时(deprecated)的属性的描述,它们已经或将在未来的Elasticsearch版本中被移除。
  与Elasticsearch交互的主要接口是基于协议和REST的。这意味着你甚至可以使用Web浏览器来完成基本的查询和请求,但对于更复杂的情况,你需要额外的命令行工具,比如cURL。如果你使用Linux或OS X命令,cURL已经可用了。如果你使用Windows,可以从curl.haxx.se/ download.下载。
  1.3.3 在Linux上用二进制包安装Elasticsearch
  安装Elasticsearch的另一个方法是使用提供的二进制包,RPM或DEB,视你的Linux发行版而定。这些二进制包可以在.elasticsearch.org/download/找到。
  1. 使用RPM包安装Elasticsearch
  下载RPM包后,你只需执行如下命令:
  sudo yum elasticsearch-1.0.0.noarch.rpm
  就这么简单。如果一切顺利,Elasticsearch应该安装好了,配置文件应该在/etc/sysconfig/ elasticsearch中。如你的操作系统基于红帽,应该可以使用/etc/init.d/elasticsearch下的init脚本。如果你的操作系统是SUSE Linux,可以使用/bin下的systemctl文件来启动和停止Elasticsearch服务。
  2. 使用DEB包安装Elasticsearch
  下载DEB包后,只需执行如下命令:
  sudo dpkg -i elasticsearch-1.0.0.deb
  就这么简单。如果一切顺利,Elasticsearch应该安装成功,配置文件存在/etc/elasticsearch/ elasticsearch.yml。/etc/init.d/elasticsearch下的init脚本可以用来启动和停止Elasticsearch。此外,/etc/default/elasticsearch下的文件包含了环境设置。
  1.3.4 目录布局
  现在,到新创建的目录中。应该可以看到的目录结构:
  目  录描  述
  bin运行Elasticsearch实例和插件管理所需的脚本
  config配置文件所在的目录
  libElasticsearch使用的库
  Elasticsearch启动后,会创建如下目录(如果目录不存在):
  目  录描  述
  dataElasticsearch使用的所有数据的存储位置
  logs关于事件和错误记录的文件
  plugins存储所安装插件的地方
  workElasticsearch使用的临时文件
  1.3.5 配置Elasticsearch
  Elasticsearch很容易入门,这是它越来越流行的原因之一,当然,不是原因。因为已为简单的环境配置了合理的默认值和自动设置,我们可以跳过配置,不需改变我们的配置文件中的任意一行而直接走到下一章。然而,为了真正理解Elasticsearch,学习一些可用的设置还是值得的。
  现在,来探讨Elasticsearch的tar.gz存档提供的默认目录和文件的布局。整个配置位于config目录下,可以看到两个文件:elasticsearch.yml(或elasticsearch.json,如果有的话会被使用)和logging.yml。个文件负责设置服务器的默认配置值。重要的是,因为一些配置值可以在运行时更改,也可作为集群状态的一部分被保留,所以这个文件中的值可能不准确。有两个值不能在运行时更改,分别是cluster.name和node.name。
  cluster.name属性保存集群的名字,不同的集群用名字来区分,配置成相同集群名字的各个节点形成一个集群。
  node.name是实例(该节点)的名字,可以不定义此参数,这时,Elasticsearch自动选择一个的名称。注意,此名称是每次启动时选择的,所以在每次重启后名称可能都不一样。在很长的时间区间或者重启过后,需要在API中提及具体实例名称,或者用监控工具查看节点,自定义一个名称还是很有帮助的。给你的节点想一个描述性的名字吧。
  文件中的其他参数有很好的注释,所以建议你看看。不要担心不理解那些解释。希望在读完几章后,一切都变得清晰起来。
  记住,大多数在elasticsearch.yml文件中设置的参数都可以用Elasticsearch REST API来覆盖。8.8节将介绍这些API。
  第2个文件(logging.yml)定义了多少信息写入系统日志,定义了日志文件,并定期创建新文件。只有在调整监控、备份方案或系统调试时,才需要修改。然而如果想有一份更详细的日志,就需要相应调整。
  我们保留这些配置文件不动。配置的一个重要部分是调整你的操作系统。在建立索引时,尤其是有很多分片和副本的情况下,Elasticsearch将创建很多文件。所以,系统不能限制打开的文件描述符小于32 000个。在Linux上,一般在/etc/security/limits.conf改,当前的值可以用ulimit命令来查看。如果达到极限,Elasticsearch将无法创建新的文件,所以合并会失败,索引会失败,新的索引无法创建。
  下一组设定关联到单个Elasticsearch实例的Java虚拟机(JVM)的堆内存限制。对小型部署来说,默认的内存限制(1024 M)就足够了,但对于大型项目不够。如果你在日志文件中发现OutOfMemoryError异常的条目,把ES_HEAP_SIZE变量设置到大于1024。当选择分配给JVM的合适内存大小时,记住,通常不应该分配超过50%的系统总内存。不过,所有的规则都有例外,稍后将更详细地讨论,但你应该经常监控JVM堆的使用量,需要时调整。
  1.3.6 运行Elasticsearch
  运行刚刚下载并解压的ZIP包,转到bin目录,然后根据不同的操作系统,运行如下命令。
  Linux或OS X:./elasticsearch。
  Windows:elasticsearch.bat。
  恭喜你!现在把Elasticsearch启动并运行起来了。它在工作时一般使用2个端口号:个是使用协议与REST API通信的端口,第2个是传输模块(transport module),是用来在集群内以及Java客户端和集群之间通信的端口。 API的默认端口号是9200,所以可以在浏览器中打开127.0.0.1:9200来检查搜索是否就绪,浏览器将显示类似这样的代码片段:
  {
   'status' : 200,
   'name' : 'es_server',
   'version' : {
     'number' : '1.0.0',
     'build_hash' : 'a46900e9c72c0a623d71b54016357d5f94c8ea32',
     'build_timestamp' : '2014-02-12T16:18:34Z',
     'build_snapshot' : false,
     'lucene_version' : '4.6'
   },
   'tagline' : 'You Know, for Search'
  }
  输出是JSON结构的。如果你还不熟悉JSON( Object Notation),请花几分钟阅读en.wikipedia.org/wiki/JSON上的这篇文章。
  Elasticsearch很聪明。如果默认端口不可用,引擎将绑定到下一个可用端口,你可以在启动时的控制台上找到如下相关信息:
  
  bound_address {i},
  publish_address {i}
  注意的片段。Elasticsearch使用了一些端口完成各种任务。我们所使用的接口是由模块处理的。
  现在,将使用cURL程序。例如,要检查集群健康度,会使用以下命令:
  curl -XGET 127.0.0.1:9200/_cluster/health?pretty
  参数-X是一个请求方法,默认值是GET(所以在上面的例子中,可以忽略此参数)。暂时不要担心GET这个值,本章的后面将更详细地描述它。
  作为一个标准,API返回的JSON对象信息里,换行符是被省略的,在请求中加上pretty参数是强制Elasticsearch在响应中加上换行符,使之更可读。你可以试着去掉pretty参数运行上面的请求,看看有什么不同。
  Elasticsearch在中小型应用程序中非常有用,但它的初衷是建成大型集群。所以,现在来建立由两个节点组成的大的集群。解压Elasticsearch到另一个目录,然后运行第二个实例。我们会在日志中看到如下内容:
    
   detected_master
  
  ], added {
  
  ],}, reason: zen-disco-receive(from master  
  
  ]])
  这意味着我们的第二个实例(名字为Stane,Obadiah)检测到了之前运行的实例(名字为Martha Johansson)。这里,Elasticsearch自动形成了一个新的双节点集群。
  请注意,在某些系统上,防火墙软件默认自动打开,可能导致节点无法找到其他节点。
  1.3.7 关掉Elasticsearch
  尽管我们期望集群或节点地一直运行下去,但仍可能需要正确地重启或者关闭,比如,为了维护。是三种可以关闭Elasticsearch的方法。
  如果节点是连接到控制台,按下Ctrl+C。
  第二种选择是通过发送TERM信号杀掉服务器进程(参考Linux上的kill命令和Windows上的任务管理器)。
  第三种方法是使用REST API。
  现在着重介绍第三种方法。可以执行以下命令来关掉整个集群:
  curl -XPOST localhost:9200/_cluster/nodes/_shutdown
  为关闭单一节点,假如节点标识符是BlrmMvBdSKiCeYGsiHig,可以执行的命令:
  curl –XPOST
  localhost:9200/_cluster/nodes/BlrmMvBdSKiCeYGsiHig/_shutdown
  节点的标识符可以在日志中看到,或者使用_cluster/nodes API,命令如下:
  curl -XGET localhost:9200/_cluster/nodes/
  1.3.8 Elasticsearch作为系统服务运行
  Elasticsearch 1.0可以作为服务运行在基于Linux的系统和基于Windows的系统上。
  1. 在Linux上运行系统服务
  如果是从提供的二进制包安装的Elasticsearch,你已经完成了,什么都不用担心。但是,如果你刚刚下载归档文件,解压到所选择的目录,就需要做一些额外的工作。为了将Elasticsearch安装成一个Linux系统服务,将使用Elasticsearch service wrapper,你可以从sgithub./ elasticsearch/elasticsearch-servicewrapper下载。
  来看看使用Elasticsearch service wrapper建立Elasticsearch Linux服务的步骤。首先,执行以下命令来下载这个wrapper:
  curl -L github./elasticsearch/elasticsearch-
   servicewrapper/tarball/master  | tar -xz
  假设Elasticsearch已经安装在/usr/local/share/elasticsearch下,执行如下命令来移动所需的wrapper文件:
  sudo mv servicewrapper/service/usr/local/share/elasticsearch/bin/
  执行如下命令来移除剩余的文件
  rm -Rf servicewrapper
  后,通过执行install命令来安装服务:
  sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
  在这之后,需要创建一个符号链接指向/usr/local/bin/rcelasticsearch下的/usr/local/share/elasticsearch/bin/service/elasticsearch脚本。可通过运行如下命令来实现:
  sudo ln -s 'readlink  -f
   /usr/local/share/elasticsearch/bin/service/elasticsearch'
     /usr/local/bin/rcelasticsearch
  就这样。如果你想启动Elasticsearch,执行如下命令:
  /etc/init.d/elasticsearch start
  2. 在Windows上运行系统服务
  在Windows下把Elasticsearch安装为系统服务非常容易,你只需转到Elasticsearch的安装目录,到bin子目录下,执行:
  service.bat install
  你会被问及操作权限,允许脚本运行,Elasticsearch就被安装成一个Windows服务。
  如果你想看看所有被service.bat脚本文件暴露出来的命令,在相同目录下执行:
  service.bat
  例如,为了启动Elasticsearch,可执行如下命令:
  service.bat start
  1.4 用REST API操作数据
  Elasticsearch REST API可用于各种任务。有了它,可以管理索引,更改实例参数,检查节点和群集状态,索引数据,搜索数据或者通过GET API检索文档。但是现在,我们将集中在API中的CRUD(create-retrieve-update-delete,增删改查)部分,它让我们能像使用NoSQL数据库一样使用Elasticsearch。
  1.4.1 理解Elasticsearch的RESTful API
  在一个类REST的架构中,每个请求都指向地址路径所表示的一个具体对象。如果/books/是一个图书馆中图书列表的引用,/books/1则引用ID为1的那本书。注意这些对象可以嵌套,/books/1/chapter/6表示图书馆的本书的第6章,等等。我们的API调用有个主题。我们想执行的操作(比如GET或POST操作)怎么样?请求类型就是用来指定这个的。协议给出了可以在API调用中用作动词的一组相当长的类型。合乎逻辑的选择是,GET用来获得请求对象的当前状态,POST来改变对象的当前状态,PUT创建一个对象,而DELETE销毁对象,另外还有个HEAD请求仅仅用来获取对象的基础信息。
  现在来看看在1.3.7节中讨论的如下操作例子,一切都应该更容易理解。
  GET localhost:9000/:这个命令用来获取Elasticsearch的基本信息。
  GET localhost:9200/_cluster/state/nodes/:这个命令获取集群中节点的信息。
  POST localhost:9200/_cluster/nodes/_shutdown:这个命令向集群中所有节点发送一个shutdown请求。
  我们现在至少知道了REST的一般概念。你可以在en.wikipedia.org/wiki/Representational_ state_transfer上阅读更多关于REST的信息。现在,可以继续学习如何使用Elasticsearch API来存储、读取、修改和删除数据。
  1.4.2 在Elasticsearch中存储数据
  我们已经讨论过,在Elasticsearch中,所有的数据,即每个文档,都有定义好的索引和类型。每个文档可以包含一个或多个字段来保存数据。首先展示如何使用Elasticsearch为一个简单文档建立索引。
  1.4.3 新建文档
  现在,尝试索引一些文档。例如,为博客建立某种内容管理系统(CMS)。文章(article)是博客中的一个实体。
  使用JSON标记,一个文档可以如下所示的例子来表示:
  {
   'id': '1',
   'title': 'New version of Elasticsearch released!',
   'content': 'Version 1.0 released today!',
   'priority': 10,
   'tags':
  }
  可以看到,JSON文档包含一组字段,每个字段可以有不同的形式。在以上示例中,我们有数字(priority)、文本(title)和字符串数组(tags)。以下示例将展示其他类型。如本章前面所述,Elasticsearch能猜出这些类型(因为JSON是半类型化的,例如,数字没有放在引号中),并自动定制这些数据在其内部结构中如何存储。
  当然,我们希望为示例文档建立索引,并使其可用于搜索。我们将使用一个名为blog的索引和名为article的类型。为了把示例文档以给定类型、标识符为1建立在索引中,执行以下命令:
  curl -XPUT localhost:9200/blog/article/1 -d '{'title': 'New version of Elasticsearch released!', content': 'Version 1.0 released today!', 'tags': }'
  注意cURL命令的一个新选项:-d参数。此选项的值是将作为请求负载的文本,也即请求主体(request body)。这样,我们可以发送附加信息,如文档定义。同时,注意标识符(1)是放在URL,而不是请求主体中。使用 PUT请求时,如果省略此标识符,该请求将返回以下错误:
  No handler found for uri and method
  如果一切正确,Elasticsearch会返回一个JSON响应,与如下输出类似:
  {
   '_index':'blog',
   '_type':'article',
   '_id':'1',
   '_version':1
  }
  前面的响应包含了此次操作状态的信息,并显示一个新的文档放在哪里,还包含了有关文档的标识符(_id)和当前版本(_version)的信息。版本将由Elasticsearch每次更新时自动递增。
  标识符的自动创建
  在上面的示例中,我们自己指定了文档标识符。然而,Elasticsearch可以自动生成它。这似乎很方便,但只有当该索引是的数据来源时,才能这么做。如果使用一个数据库来存储数据,用Elasticsearch全文搜索,那数据同步将会被阻碍,除非在数据库中也存储生成的标识符。使用 POST请求类型并且不在URL中指定标识符,就可以生成一个标识符。例如,看的命令:
  curl -XPOST localhost:9200/blog/article/ -d '{'title': 'New version of Elasticsearch released!', 'content': 'Version 1.0  released today!', 'tags': }'
  注意,要使用 POST方法,而不是前面示例中的PUT方法。参考前面关于REST动词的描述,我们想更改列表中的文档索引,而不是创建一个新的实体,所以使用POST而不是PUT。服务器应该返回类似的响应:
  {
   '_index' : 'blog',
   '_type' : 'article',
   '_id' : 'XQmdeSe_RVamFgRHMqcZQg',
   '_version' : 1
  }
  注意加粗的那一行,这是一个Elasticsearch自动生成的标识符。
  1.4.4 检索文档
  我们已经将实例存储在了文档中,现在尝试通过标识符检索。首先执行以下命令:
  curl -XGET localhost:9200/blog/article/1
  Elasticsearch将返回类似的响应:
  {
   '_index' : 'blog',
   '_type' : 'article',
   '_id' : '1',
   '_version' : 1,
   'ests' : true,
   '_source' : {
     'title': 'New version of Elasticsearch released!',
     'content': 'Version 1.0 released today!',
     'tags':
   }
  在前面的响应中,除了索引、类型、标识符和版本,还可以看到说明“发现文件存在”(ests属性)以及此文档来源(_source属性)的信息。如果没有找到文档,得到的响应如下所示:
  {
   '_index' : 'blog',
   '_type' : 'article',
   '_id' : '9999',
   'ests' : false
  }
  因为没有找到文档,当然也就没有版本或来源的信息。
  1.4.5 更新文档
  更新索引中的文档是一项更复杂的任务。在内部