Elasticsearch是一个基于Lucene的开源分布式搜索引擎,具备分布式多用户能力。Elasticsearch是用java开发,提供Restful接口,可以达到实时搜索、高性能计算;同时Elasticsearch的横向扩展能力很是强,不须要重启服务,基本上达到了零配置。可是目前来讲相关资料不多,同时版本更新很快,bug存在,API繁多而且变化。java
索引(index)是Elasticsearch存放数据的地方。若是你熟悉关系型数据库,就能够将索引理解为关系型数据库的一张表。但与关系型数据库相比,Elasticsearch能够快速、搞笑地对索引中的数据进行全文检索,而且不须要存储原始数据。若是你熟悉MongoDB,就能够将Elasticsearch的索引理解为MongoDB中的集合。若是你熟悉CouchDB,就能够将索引理解为CouchDB中的数据库。node
文档(document)是Elasticsearch中存储的主要实体。文档由字段(行数据的列)组成,Elasticsearch容许一个字段出现屡次,该类字段被称为多值字段(multivalued)。每一个字段对应一种类型(字符串型、数值型、日期型等)。字段类型能够是复合的,字段能够包含其余子文档或数组。字段类型在Elasticsearch中很是重要,它使得搜索引擎知道应如何执行不一样的操做,如比较、排序等。幸运的是Elasticsearch能够自动肯定字段类型。与关系型数据库不一样,Elasticsearch的文档不须要有固定结构,不一样文档能够具备不一样的字段集合,并且在程序开发时不须要知道文档的字段。固然,用户也能够经过模式映射(schema mapping)定义文档结构。git
在Elasticsearch中,一个索引能够存储许多不一样用途的对象。例如,基于Elasticsearch的博客能够存储文章和评论。文档类型能够帮助咱们轻松地区分这些对象。值得注意的是,每一个文档能够有不一样的结构。在实际操做中,将该文档划分为不一样类型对数据操做有明显的帮助。划分时须要牢记一些限制条件,其中一个限制条件就是不一样的文档类型对同一字段不能设置为不一样的字段类型。github
Elasticsearch能够做为一个独立的搜索服务工做。然而,为了可以处理大型数据集并实现容错功能,Elasticsearch支持在多台协同工做的服务器运行。这些服务器被统称为一个集群(cluster),集群的每一个服务器则被称为一个节点(node)。能够经过索引分片(分割成更小的个体)将海量数据进行分割并分布到不一样节点。经过副本(索引部分的拷贝)能够实现更强的可用性和更高的性能。数据库
当须要存储大规模文档时,因为RAM空间、硬盘容量等的限制,仅使用一个节点是不够的。另外一个问题是一个节点的计算能力达不到所指望的复杂功能的要求。在这些状况下,能够将数据切分,每部分是一个单独的ApacheLucene索引,称为分片(shard)。每一个分片能够被存储在集群的不一样节点上。当须要查询一个由多个分片构成的索引时,Elasticsearch将该查询发送到每一个相关的分片,并将结果合并。这些过程对具体应用而言是透明的,无须知道分片的存在。ubuntu
为了提升查询的吞吐量或实现高可用性,能够启用分片副本功能。副本分片是对原始分片的一个精确拷贝,原始分片被称为主分片。对索引的全部修改操做都直接做用在主分片上,每一个主分片能够有零个或者多个副本分片。当主分片丢失时(如存储数据的服务器不可用时),集群能够将一个副本分片提高为新的主分片。windows
Elasticsearch安装方式有不少,支持多种平台(包括windows),同时有相对应的安装包(tar.gz, zip, rpm[centos], deb[ubuntu]),这里以elasticsearch-1.4.4版本为例,系统为centos6.5。centos
这种方式相对比较简单,可是在命令行显式运行,不方便进行管理,不是做为系统服务运行,可是这种方式可使你在一台主机上运行多个实例。数组
解压elasticsearch-1.4.4.tar.gz获得elasticsearch-1.4.4目录。浏览器
进入elasticsearch-1.4.4/config目录,修改elasticsearch.yml,找到cluster.name,去掉前面的#,修改成cluster.name: supconit,这就是集群的名称,全部节点都必须设置为同样,elasticsearch就会自动识别和关联节点(同一网段),组成集群。
修改elasticsearch.yml,找到node.name,去掉前面的#,修改成node.name:node1(本身随便取),可是每一个节点的名字必须不同。
复制elasticsearch-1.4.4到不一样的主机,修改node.name。
其余配置,能够进入elasticsearch-1.4.4/bin目录修改elasticsearch.in.sh(主要是jvm参数),elasticsearch.yml中也还有不少其余的参数(集群、分片、副本等配置),日志配置修改logging.yml。
这种方式安装也很方便,系统服务运行,可是安装完后目录比较分散,不方便配置,一台主机只能运行一个实例。
运行sudo rpm -ivh elasticsearch-1.4.4.noarch.rpm。
安装成功后,elasticsearch程序目录为/usr/share/elasticsearch,输入sudo chkconfig --add elasticsearch添加服务。
进入/etc/elasticsearch目录,修改elasticsearch.yml,找到cluster.name,去掉前面的#,修改成cluster.name: supconit,这就是集群的名称,全部节点都必须设置为同样,elasticsearch就会自动识别和关联节点(同一网段),组成集群。
修改elasticsearch.yml,找到node.name,去掉前面的#,修改成node.name:node1(本身随便取),可是每一个节点的名字必须不同。
复制elasticsearch-1.4.4.noarch.rpm到不一样节点,执行1~4步骤。
其余配置,能够进入elasticsearch-1.4.4/bin目录修改elasticsearch.in.sh(主要是jvm参数),elasticsearch.yml中也还有不少其余的参数(集群、分片、副本等配置),日志配置修改logging.yml。
$ ./elasticsearch (前台运行)
$ ./elasticsearch -d (后台进程运行)
$ sudo service elasticsearch start (rpm安装,服务方式启动)
前台运行,能够经过"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"关闭服务
BigDesk Plugin ------ 监控ES状态的插件
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页面了。
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 } ] }