一、简介
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。支持通过HTTP使用JSON进行数据索引。
Lucene只是一个框架,要利用它的功能,需要使用JAVA,并且在程序中集成Lucene。更糟的是,Lucene非常复杂,需要做很多的学习了解,才能明白它是如何运行的。
Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,请不需要了解其背后复杂的Lucene的运行原理。所以ElasticSearch可以看作是Lucene的封装。
二、安装
1、安装JDK
ElasticSearch,简称ES,是使用Lucene作为内部引擎,而Lucene是纯Java语言编写的,因此也是运行在JVM上的。
假设JDK安装包位于/home/test/java目录下,Linux中安装JDK:
- 安装JDK
以root身份在/usr/下建立java目录:sudo mkdir /usr/java
rpm –ivh /home/test/java/jdk-7u67-linux-i586.rpm (使用该命令进行安装,会安装到/usr/java/目录下)
- 配置JDK环境变量(需要管理员权限):
sudo vi /etc/profile
#JAVA_HOME
export JAVA_HOME=/usr/java/jdk1.7.0_67
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH: $JAVA_HOME/bin
- 验证安装
java -version
输出Java版本的相关信息,及表示安装成功。
2、下载ElasticSearch
ES下载地址:http://www.elasticsearch.org/download 目前最新版本是:1.4.1
3、安装ElasticSearch
将安装包放于/homg/test/目录下,解压elasticsearch-1.4.1.tar:tar –zxvf /home/test/elasticsearch-1.4.1.tar
4、运行ElasticSearch
解压安装后,在/home/test/elasticsearch-1.4.1/目录下会有三个文件夹:bin、config、lib
运行bin文件夹下的elasticsearch即可将ES系统跑起来:./elasticsearch
5、注意点
最新版的ES需要JDK 1.7及以上
若使用Java API进行操作ES,两者的JDK版本还需一致
三、配置
1、配置文件说明
配置文件位于config目录下,主要有:elasticsearch.yml(ES框架的核心配置)、logging.yml(日志记录相关配置,使用的是log4j进行日志记录)
2、配置项详解
主要解释elasticsearch.yml下各配置项的含义。
################################### 集群###################################
# 集群名称,默认为elasticsearch,在同一网段,具有相同集群名字的节点会自动成为一个集群
#cluster.name: elasticsearch
####################################节点#####################################
# 节点名称,es启动时会自动创建节点名称
#node.name: "Franz Kafka"
# 是否作为主节点,每个节点都可以被配置成为主节点,默认值为true,只有设置为true时,才有可能成为master,最先启动,且该参数设为true的节点会被推选了master
#node.master: true
# 每个节点都可以定义一些与之关联的通用属性,用于后期集群进行碎片分配时的过滤
#node.rack: rack314
# 默认情况下,多个节点可以在同一个安装路径启动,如果你想让你的es只启动一个节点,可以进行如下设置
#node.max_local_storage_nodes: 1
#################################### 索引####################################
# 设置一个索引的分片数量,默认值为5
#index.number_of_shards: 5
# 设置一个索引可被复制的数量,默认值为1
#index.number_of_replicas: 1
# 当你想要禁用公布式时,你可以进行如下设置
#index.number_of_shards: 1
#index.number_of_replicas: 0
# 这两个属性的设置直接影响集群中索引和搜索操作的执行。假设你有足够的机器来持有碎片和复制品,那么可以按如下规则设置这两个值:
# 1) 拥有更多的碎片可以提升索引执行能力,并允许通过机器分发一个大型的索引;
# 2) 拥有更多的复制器能够提升搜索执行能力以及集群能力。
# 对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少
#################################### Paths ####################################
# 配置文件所在的位置,即elasticsearch.yml和logging.yml所在的位置
#path.conf: /path/to/conf
# 分配给当前节点的索引数据所在的位置,可以设置多个路径,路径之间用逗号分隔
#path.data: /path/to/data
# 临时文件位置
#path.work: /path/to/work
# 日志文件所在位置
#path.logs: /path/to/logs
# 插件安装位置
#path.plugins: /path/to/plugins
#################################### 插件###################################
# 插件托管位置,若列表中的某一个插件未安装,则节点无法启动
#plugin.mandatory: mapper-attachments,lang-groovy
################################### 内存####################################
# JVM开始交换时,ElasticSearch表现并不好:你需要保障JVM不进行交换,
# 可以将bootstrap.mlockall设置为true禁止交换
#bootstrap.mlockall: true
##############################网络和HTTP###############################
# 默认情况下,ElasticSearch使用0.0.0.0地址,并为http传输开启9200-9300端口,
# 为节点到节点的通信开启9300-9400端口,也可以自行设置IP地址
#network.bind_host: 192.168.0.1
# 设置其他节点连接此节点的地址,如果不设置的话,则自动获取
#network.publish_host: 192.168.0.1
# 定制该节点与其他节点交互的端口
#transport.tcp.port: 9300
# 节点间交互时,可以设置是否压缩,默认为不压缩
#transport.tcp.compress: true
# Http传输监听定制端口
#http.port: 9200
# 设置内容的最大长度
#http.max_content_length: 100mb
# 禁止HTTP
#http.enabled: false
################################### 网关###################################
# 网关允许在所有集群重启后持有集群状态,集群状态的变更都会被保存下来,
# 当第一次启用集群时,可以从网关中读取到状态,默认网关类型(也是推荐的)是local
#gateway.type: local
# 允许在N个节点启动后恢复过程
#gateway.recover_after_nodes: 1
# 设置初始化恢复过程的超时时间
#gateway.recover_after_time: 5m
# 设置该集群中可存在的节点上限
#gateway.expected_nodes: 2
############################# 恢复设置#############################
# 设置一个节点的并发数量,有两种情况,一种是在初始复苏过程中
#cluster.routing.allocation.node_initial_primaries_recoveries: 4
# 另一种是在添加、删除节点及调整时
#cluster.routing.allocation.node_concurrent_recoveries: 2
# 设置复苏时的吞吐量,默认情况下是 20mb
#indices.recovery.max_bytes_per_sec: 20mb
# 设置从对等节点恢复片段时打开的流的数量上限
#indices.recovery.concurrent_streams: 5
################################## Discovery ##################################
# 设置一个集群中主节点的数量,当多于三个节点时,该值可在2-4之间
#discovery.zen.minimum_master_nodes: 1
# 设置ping其他节点时的超时时间,网络比较慢时可将该值设大
#discovery.zen.ping.timeout: 3s
# 禁止当前节点发现多个集群节点,默认值为false
#discovery.zen.ping.multicast.enabled: false
# 设置新节点被启动时能够发现的主节点列表
#discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
##################################日志显示##################################
# Shard level query and fetch threshold logging.
#index.search.slowlog.threshold.query.warn: 10s
#index.search.slowlog.threshold.query.info: 5s
#index.search.slowlog.threshold.query.debug: 2s
#index.search.slowlog.threshold.query.trace: 500ms
#index.search.slowlog.threshold.fetch.warn: 1s
#index.search.slowlog.threshold.fetch.info: 800ms
#index.search.slowlog.threshold.fetch.debug: 500ms
#index.search.slowlog.threshold.fetch.trace: 200ms
#index.indexing.slowlog.threshold.index.warn: 10s
#index.indexing.slowlog.threshold.index.info: 5s
#index.indexing.slowlog.threshold.index.debug: 2s
#index.indexing.slowlog.threshold.index.trace: 500ms
##################################垃圾回收日志记录################################
#monitor.jvm.gc.young.warn: 1000ms
#monitor.jvm.gc.young.info: 700ms
#monitor.jvm.gc.young.debug: 400ms
#monitor.jvm.gc.old.warn: 10s
#monitor.jvm.gc.old.info: 5s
#monitor.jvm.gc.old.debug: 2s
################################## 安全################################
# Uncomment if you want to enable JSONP as a valid return transport on the
# http server. With this enabled, it may pose a security risk, so disabling
# it unless you need it is recommended (it is disabled by default).
#http.jsonp.enable: true
四、核心概念
- 集群
一个集群就是由一个或多个节点组织在一起, 它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch” 。一个节点只能通过指定某个集群的名字,来加入这个集群。
- 节点
一个节点是集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是随机的。这个名字会在启动的时候赋予节点。 这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch 集群中的哪些节点。
在一个集群里,可以拥有任意多个节点。而且,如果当前网络中没有运 行 任 何 Elasticsearch 节 点 , 这 时 启 动 一 个 节 点 , 会 默 认 创 建并 加 入 一 个 叫 做“elasticsearch”的集群.
- 索引
一个索引就是一个拥有几分相似特征的文档的集合。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。类似于数据库db。
- 类型
在一个索引中,可以定义一种或多种类型。 一个类型是索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。类似于数据表table
- 文档
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,在一个 index/type 里面,可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的 type。类似于一行记录。
- 切片和复制
一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引” ,这个“索引”可以被放置到集群中的任何节点上。
- 总结--与关系型数据库的对比
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)
五、相关资料链接
http://www.elasticsearch.org/guide/en/elasticsearch/
http://learnes.net/getting_started/installing_es.html