一、ES介绍
Gitbook[中文未完整]: http://learnes.net/
Gitbook[英文完整]:https://allen8807.gitbooks.io/elasticsearch-definitive-guide-en/content/
权威指南: http://es.xiaoleilu.com/
官网: https://www.elastic.co/guide/index.html
官网API:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/index.html
official: Elasticsearch is a distributed, RESTful search and analytics engine capable of solving a growing number of use cases. As the heart of the Elastic Stack, it centrally stores your data so you can discover the expected and uncover the unexpected.
Elasticsearch 是一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎,可以说 Lucene 是当今最先进,最高效的全功能开源搜索引擎框架。但是 Lucene 只是一个框架,要充分利用它的功能,你需要使用 JAVA,并且在你的程序中集成 Lucene。更糟的是,你需要做很多的学习了解,才能明白它是如何运行的,Lucene 确实非常复杂。
当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:
- 分布式实时存储,并将每一个字段都编入索引,使其可以被搜索(准实时,有轻微延迟,1s左右)。
- 实时分析的分布式搜索引擎。
- 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
Elasticsearch 是 面向文档型数据库,这意味着它存储的是整个对象或者 文档,它不但会存储它们,还会为他们建立索引,这样你就可以搜索他们了。你可以在 Elasticsearch 中索引、搜索、排序和过滤这些文档。不需要成行成列的数据。这将会是完全不同的一种面对数据的思考方式,这也是为什么 Elasticsearch 可以执行复杂的全文搜索的原因。
ES特性:
支持Restful,大量的Restful api
json风格
分布式索引和搜索
天然支持shard,replication
高性能,易扩展,使用简单
二、Basic Concepts
https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html
2.1 Document
{ "name": "John Smith", "age": 42, "confirmed": true, "join_date": "2014-06-01", "home": { "lat": 51.5, "lon": 0.1 }, "accounts": [ { "type": "facebook", "id": "johnsmith" }, { "type": "twitter", "id": "johnsmith" } ] }
在Elasticsearch中,文档这个单词有特殊的含义。它指的是在Elasticsearch中被存储到唯一ID下的由最高级或者根对象 (root object )序列化而来的JSON.
除了数据信息,ES中还存有文档的元数据信息—— 关于文档的信息,下面是3个必须的元数据信息
_index
:: Where the document lives
_type
:: The class of object that the document represents
_id
:: The unique identifier for the document
(1) _index
类似于传统数据库中的"库"-存储并且索引数据的地方
在ES中,我们的数据都在分片中被存储以及索引,索引是一个逻辑命名空间,它可以将一个或者多个分片组合在一起。
(2) _type
在ES中我们使用同样_type的文档来代表同类,因为它们的数据结构是相同的
每一个类型都有自己的mapping或者结构定义,它们定义了当前类型的数据结构,类似于数据表中的列。
Documents of all types can be stored in the same index, but the mapping for type tell ES how the data in each document should be indexed.
(3) _id
id是一个字符串,当它与_index
以及_type
组合时,就可以来代表Elasticsearch中一个特定的文档。我们创建了一个新的文档时,你可以自己提供一个_id
,或者也可以让Elasticsearch帮你生成一个
2.2 Index
文档通过索引
API被索引——存储并使其可搜索。但是最开始我们需要决定我们将文档存储在哪里。正如之前提到的,一篇文档通过_index
, _type
以及_id
来确定它的唯一性。
如果我们的索引叫做"website"
,我们的类型叫做 "blog"
,然后我们选择"123"
作为ID的编号。这时,请求就是这样的:
PUT /website/blog/123 { "title": "My first blog entry", "text": "Just trying this out...", "date": "2014/01/01" }
Elasticsearch返回内容:
{ "_index": "website", "_type": "blog", "_id": "123", "_version": 1, "created": true }
2.3 Cluster Replication Shard
ES的集群标识为集群为名称:默认为"elasticsearch"。节点通过名字来判定加入哪一个集群。一个节点属于一个集群。
分片(shard) 是 工作单元(worker unit) 底层的一员,它只负责保存索引中所有数据的一小片。在 elasticsearch 中,分片用来分配集群中的数据。把分片想象成一个数据的容器。数据被存储在分片中,然后分片又被分配在集群的节点上。当你的集群扩展或者缩小时,elasticsearch 会自动的在节点之间迁移分配分片,以便集群保持均衡。
片分为 主分片(primary shard) 以及 从分片(replica shard) 两种。在你的索引中,每一个文档都属于一个主分片,所以具体有多少主分片取决于你的索引能存储多少数据。从分片只是主分片的一个副本,它用于提供数据的冗余副本,在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求。
索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变。
2.4 mapping field source field
映射类似于数据库中的表结构,每一个索引都有一个映射,它定义了每一个字段类型,以及一个索引范围内的设置。一个映射可以被事先定义,如果没有事先定义,也存储文档的时候ES也会尝试进行自动识别。
mapping机制也被ES用于字段分析,每个字段都有一种确定的类型
field(字段)则非常好理解,类似于MySQL中列的概念,每个field都有一个类型,这个关系被定义在mapping中。重要的是,ES中,每一个字段都会被索引,因此其查询能力非常的强。
source field:默认情况下,document的原始内容被存储在_source中,查询的时候返回的是一个精确的json字符串。
2.5 node
节点指的集群中的某一个ES服务器,一个节点是一个逻辑上独立的服务,它是集群的一部分。
每个cluster都有一个master node,这是由ES管理的。
master用于管理集群的变更,例如新建或者删除索引,增加或者移除节点等。master node不会参与文档级别的变更或者搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。
三、install
依赖于jdk,依赖于java的都好安装,直接解压或者rpm包都可以,略
集群搭建也很简单,一般的方式,同步时间,无ssh密钥通信等.
其配置文件解释的非常详细...
systemctl daemon-reload
systemctl start elasticsearch.service
如果出错JAVA_HOME找不到,可以在/etc/sysconfig/elasticsearch中指定环境变量JAVA_HOME
install plugin:
插件集地址: http://www.kailing.pub/article/index/arcid/87.html
插件扩展的功能:
添加自定义的映射类型、自定义分词器、本地脚本、自定义节点发现方式
安装:
直接将plugin放置于插件目录
使用命令plugin
先安装一些常用的插件:
1. 安装Head,免费
./plugin install mobz/elasticsearch-head
2. 安装marvel,收费的,但是官方推荐...
3. 安装分词器ik
https://github.com/medcl/elasticsearch-analysis-ik上有源码,因此可以使用源码安装