分布式搜索引擎Elasticsearch安装配置

yn6e 10年前

本文主要介绍了elasticsearch,还介绍了elasticsearch的安装配置,包括插件的安装使用。对于新入门的同学应该很有帮助,对于已经熟悉的同学也不失为一篇安装教程,尤其是插件安装。

分布式搜索引擎Elasticsearch

介绍

Elasticsearch是一个基于Lucene的开源分布式搜索引擎,具有分布式多用户能力。Elasticsearch是用java开发,提供Restful接口,能够达到实时搜索、高性能计算;同时Elasticsearch的横向扩展能力非常强,不需要重启服务,基本上达到了零配置。但是目前来说相关资料很少,同时版本更新很快,bug存在,API繁多并且变化。

概念和设计

索引

索引(index)是Elasticsearch存放数据的地方。如果你熟悉关系型数据库,就可以将索引理解为关系型数据库的一张表。但与关系型数据库相比,Elasticsearch可以快速、搞笑地对索引中的数据进行全文检索,并且不需要存储原始数据。如果你熟悉MongoDB,就可以将Elasticsearch的索引理解为MongoDB中的集合。如果你熟悉CouchDB,就可以将索引理解为CouchDB中的数据库。

文档

文档(document)是Elasticsearch中存储的主要实体。文档由字段(行数据的列)组成,Elasticsearch允许一个字段出现多次,该类字段被称为多值字段(multivalued)。每个字段对应一种类型(字符串型、数值型、日期型等)。字段类型可以是复合的,字段可以包含其他子文档或数组。字段类型在Elasticsearch中非常重要,它使得搜索引擎知道应如何执行不同的操作,如比较、排序等。幸运的是Elasticsearch可以自动确定字段类型。与关系型数据库不同,Elasticsearch的文档不需要有固定结构,不同文档可以具有不同的字段集合,而且在程序开发时不需要知道文档的字段。当然,用户也可以通过模式映射(schema mapping)定义文档结构。

文档类型

在Elasticsearch中,一个索引可以存储许多不同用途的对象。例如,基于Elasticsearch的博客可以存储文章和评论。文档类型可以帮助我们轻松地区分这些对象。值得注意的是,每个文档可以有不同的结构。在实际操作中,将该文档划分为不同类型对数据操作有明显的帮助。划分时需要牢记一些限制条件,其中一个限制条件就是不同的文档类型对同一字段不能设置为不同的字段类型。

节点与集群

Elasticsearch可以作为一个独立的搜索服务工作。然而,为了能够处理大型数据集并实现容错功能,Elasticsearch支持在多台协同工作的服务器运行。这些服务器被统称为一个集群(cluster),集群的每个服务器则被称为一个节点(node)。可以通过索引分片(分割成更小的个体)将海量数据进行分割并分布到不同节点。通过副本(索引部分的拷贝)可以实现更强的可用性和更高的性能。

分片

当需要存储大规模文档时,由于RAM空间、硬盘容量等的限制,仅使用一个节点是不够的。另一个问题是一个节点的计算能力达不到所期望的复杂功能的要求。在这些情况下,可以将数据切分,每部分是一个单独的ApacheLucene索引,称为分片(shard)。每个分片可以被存储在集群的不同节点上。当需要查询一个由多个分片构成的索引时,Elasticsearch将该查询发送到每个相关的分片,并将结果合并。这些过程对具体应用而言是透明的,无须知道分片的存在。

副本

为了提高查询的吞吐量或实现高可用性,可以启用分片副本功能。副本分片是对原始分片的一个精确拷贝,原始分片被称为主分片。对索引的所有修改操作都直接作用在主分片上,每个主分片可以有零个或者多个副本分片。当主分片丢失时(如存储数据的服务器不可用时),集群可以将一个副本分片提升为新的主分片。

安装和配置Elasticsearch集群

Elasticsearch安装方式有很多,支持多种平台(包括windows),同时有相对应的安装包(tar.gz, zip, rpm[centos], deb[ubuntu]),这里以elasticsearch-1.4.4版本为例,系统为centos6.5。

tar.gz安装及配置

这种方式相对比较简单,但是在命令行显式运行,不方便进行管理,不是作为系统服务运行,但是这种方式可以使你在一台主机上运行多个实例。

  1. 解压elasticsearch-1.4.4.tar.gz得到elasticsearch-1.4.4目录。

  2. 进入elasticsearch-1.4.4/config目录,修改elasticsearch.yml,找到cluster.name,去掉前面的#,修改为cluster.name: supconit,这就是集群的名称,所有节点都必须设置为一样,elasticsearch就会自动识别和关联节点(同一网段),组成集群。

  3. 修改elasticsearch.yml,找到node.name,去掉前面的#,修改为node.name:node1(自己随便取),但是每个节点的名字必须不一样。

  4. 复制elasticsearch-1.4.4到不同的主机,修改node.name。

  5. 其他配置,可以进入elasticsearch-1.4.4/bin目录修改elasticsearch.in.sh(主要是jvm参数),elasticsearch.yml中也还有很多其他的参数(集群、分片、副本等配置),日志配置修改logging.yml。

rpm安装及配置

这种方式安装也很方便,系统服务运行,但是安装完后目录比较分散,不方便配置,一台主机只能运行一个实例。

  1. 运行sudo rpm -ivh elasticsearch-1.4.4.noarch.rpm。

  2. 安装成功后,elasticsearch程序目录为/usr/share/elasticsearch,输入sudo chkconfig --add elasticsearch添加服务。

  3. 进入/etc/elasticsearch目录,修改elasticsearch.yml,找到cluster.name,去掉前面的#,修改为cluster.name: supconit,这就是集群的名称,所有节点都必须设置为一样,elasticsearch就会自动识别和关联节点(同一网段),组成集群。

  4. 修改elasticsearch.yml,找到node.name,去掉前面的#,修改为node.name:node1(自己随便取),但是每个节点的名字必须不一样。

  5. 复制elasticsearch-1.4.4.noarch.rpm到不同节点,执行1~4步骤。

  6. 其他配置,可以进入elasticsearch-1.4.4/bin目录修改elasticsearch.in.sh(主要是jvm参数),elasticsearch.yml中也还有很多其他的参数(集群、分片、副本等配置),日志配置修改logging.yml。

运行elasticsearch

  • $ ./elasticsearch (前台运行)

  • $ ./elasticsearch -d (后台进程运行)

  • $ sudo service elasticsearch start (rpm安装,服务方式启动)


关闭elasticsearch

  • 前台运行,可以通过"CTRL+C"组合键来停止运行

  • 后台运行,可以通过"kill -9 进程号"停止;也可以通过REST API接口"curl -XPOST http://主机IP:9200/_cluster/nodes/_shutdown"来关闭整个集群,"curl -XPOST http://主机IP:9200/_cluster/nodes/节点标示符(如Bjkhlujigopojhih)/_shutdown"来关闭单个节点

  • rpm安装,"sudo service elasticsearch stop"关闭服务

插件


站点插件(以网页形式展现)


  1. BigDesk Plugin ------ 监控ES状态的插件

  2. Elasticsearch Head Plugin ------ 很方便对ES进行各种操作的客户端,比如各种方式的查询,索引量查看,节点状态查看等


插件安装

安装方式有两种,离线安装和在线安装,在线安装相对来说比较方便,执行命令就行,但是很多公司环境是内网,不能访问外网,所以就需要离线安装,离线安装网上的资料非常少,所以这也是一个福利送给大家(本人试了好久才试出来的)。两种安装都需要进入主目录下的bin目录,执行plugin脚本。

  • $ ./plugin -install mobz/elasticsearch-head (这是安装head插件,在线安装)

  • $ ./plugin install head -url file:/downloads/elasticsearch-head-master.zip (这是离线安装方式,file后面就是插件路径,去github上直接下载,地址就不提供了,时间久了会变,直接上git上搜就行)

安装完成后,在浏览器输入http://localhost:9200/_plugin/head就可以打开插件看详情了,"head"换成"bigdesk",进入的就是bigdesk页面了。

分词插件IK

插件安装

analysis-ik安装没那么方便,不能用命令安装,相对比较麻烦。

   1. 下载https://github.com/medcl/elasticsearch-analysis-ik

  2. 解压进入目录执行"mvn clean package",生成target目录。

   3. 解压后将config/ik目录复制到你的elasticsearch主目录的config目录下(如果是rpm安装方式,则复制到/etc/esticsearch目录).

   4. 编辑config/elasticsearch.yml(rpm安装,编辑/etc/elasticsearch/elasticsearch.yml),在文件末尾添加下面内容(不能有tab键,只许空格)

index:    analysis:                         analyzer:              ik:            alias: [ik_analyzer]            type: org.elasticsearch.index.analysis.IkAnalyzerProvider        ik_max_word:            type: ik            use_smart: false        ik_smart:            type: ik            use_smart: true  index.analysis.analyzer.default.type: ik


   5. 在elasticsearch主目录plugins目录(没有就自己新建这个目录)下新建analysis-ik目录,复制解压打包生成的文件elasticsearch-analysis-ik-1.2.9.jar(位于target目录下)到新建的analysis-ik目录下。

   6. 将target/releases下的所有jar包复制到elasticsearch主目录下的lib目录下。

测试
  • 新建索引名为test的索引 "curl -XPUT http://localhost:9200/test"

  • 给索引创建mapping

curl -XPOST http://localhost:9200/test/test/_mapping -d'  {      "test": {          "properties": {              "content": {                  "type" : "string",                  "boost" : 8.0,                  "term_vector" : "with_positions_offsets",                  "analyzer" : "ik",                  "include_in_all" : true              }          }      }  }'


  • 测试命令

curl 'http://localhost:9200/test/_analyze?analyzer=ik&pretty=true' -d '  {  "text":"这是我的第一个elasticsearch集群"  }'


  • 测试结果

{    "tokens" : [ {      "token" : "text",      "start_offset" : 4,      "end_offset" : 8,      "type" : "ENGLISH",      "position" : 1    }, {      "token" : "这是",      "start_offset" : 11,      "end_offset" : 13,      "type" : "CN_WORD",      "position" : 2    }, {      "token" : "我",      "start_offset" : 13,      "end_offset" : 14,      "type" : "CN_CHAR",      "position" : 3    }, {      "token" : "第一个",      "start_offset" : 15,      "end_offset" : 18,      "type" : "CN_WORD",      "position" : 4    }, {      "token" : "第一",      "start_offset" : 15,      "end_offset" : 17,      "type" : "CN_WORD",      "position" : 5    }, {      "token" : "一个",      "start_offset" : 16,      "end_offset" : 18,      "type" : "CN_WORD",      "position" : 6    }, {      "token" : "一",      "start_offset" : 16,      "end_offset" : 17,      "type" : "TYPE_CNUM",      "position" : 7    }, {      "token" : "个",      "start_offset" : 17,      "end_offset" : 18,      "type" : "COUNT",      "position" : 8    }, {      "token" : "elasticsearch",      "start_offset" : 18,      "end_offset" : 31,      "type" : "ENGLISH",      "position" : 9    }, {      "token" : "集群",      "start_offset" : 31,      "end_offset" : 33,      "type" : "CN_WORD",      "position" : 10    } ]  }