参考文档https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。
它可以快速地储存、搜索和分析海量数据
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,直接可以使用。
一、安装
前提需要安装 Java 8,Linux下输入命令下载、解压、运行
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip
$ unzip elasticsearch-5.5.1.zip
$ cd elasticsearch-5.5.1/
接着,进入解压后的目录,运行下面的命令,启动 Elastic。
$ ./bin/elasticsearch
Elastic会在默认的9200端口运行。这时,打开另一个命令行窗口,请求该端口,会得到说明信息。
$ curl localhost:9200
{
"name" : "atntrTf",//节点名
"cluster_name" : "elasticsearch",//所属集群名
"cluster_uuid" : "tf9250XhQ6ee4h7YI11anA",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
上面代码中,请求9200端口,Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息。
按下 Ctrl + C,Elastic 就会停止运行。
默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以sudo vim (Elastic 安装目录的)config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,然后重新启动 Elastic。
二、基本概念
2.1 Cluster
集群,一个ES集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识
2.2 node
节点,一个ES实例就是一个node,一个机器可以有多个实例,所以并不能说一台机器就是一个node,大多数情况下每个node运行在一个独立的环境或虚拟机上。
2.3 index
索引,即一系列documents的集合
2.4 shard
1.分片,ES是分布式搜索引擎,每个索引有一个或多个分片,索引的数据被分配到各个分片上,相当于一桶水用了N个杯子装
2.分片有助于横向扩展,N个分片会被尽可能平均地(rebalance)分配在不同的节点上(例如你有2个节点,4个主分片(不考虑备份),那么每个节点会分到2个分片,后来你增加了2个节点,那么你这4个节点上都会有1个分片,这个过程叫relocation,ES感知后自动完成)
3.分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request.
4.每个分片都是一个Lucene Index,所以一个分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519 个docs。
分片的作用:
1)支持横向扩展,当数据无限增大的情况下可以把分片直接转移到另一台物理机上,而不是增加单一机器的配置
2)支持并发查询,可以实现多台物理机协同处理联合查询,增加吞吐量
2.5 replica
1.复制,可以理解为备份分片,相应地有primary shard(主分片)
2.主分片和备分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建5个分片一个备份(即5primary+5replica=10个分片)
3.如果你只有一个节点,那么5个replica都无法分配(unassigned),此时cluster status会变成Yellow。
主从分片之间数据同步方式:主分片数据发生改变通知相应副本分片,副本分片开始复制主分片,复制完成后通知主分片,数据可用
副本的作用 :
1)实现高可用,在主分片出现问题的情况下依旧能够提供完整的数据用于查询
2)提高搜索吞吐量,副本具有用户只读属性,用户可以在主分片和副本分片上查询数据
2.6 Replica主从之间的数据同步
1)主分片数据发生改变,通知相应的副本分片
2)副本分片开始复制
3)复制成功后返回确认消息给主分片
4)主分片确认后发布
查看当前节点的所有Index
$ curl -X GET 'http://localhost:9200/_cat/indices?v'
2.7 Document
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是官方文档说明。
$ curl -X GET 'http://localhost:9200/_cat/indices?v'
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
2.8 Mapping
映射是定义一个文档以及其所包含的字段如何被存储和索引的方法。
例如,用映射来定义以下内容:
1)哪些 string 类型的 field 应当被当成当成 full-text 字段
2)哪些字段应该是数值类型、日期类型或者是地理位置信息
3)日期类型字段的格式是怎么样的
4)是否文档的所有字段都需要被索引到 _all 字段
动态增加的 field 可以由用户自定义的模板来控制其行为
三、实际操作
3.1 查看集群(Cluster)健康度
curl -X GET "localhost:9200/_cat/health?v"
返回
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1475247709 17:01:49 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%
其中 status表示集群健康度,分为green yellow red,其中green表示状态良好,所有数据可用,创建了一个或以上的副本,yellow表示当前节点孤立或者没有创建副本,但所有数据可用,red表示状态异常,部分功能可用
3.2 获得集群列表
curl -X GET "localhost:9200/_cat/nodes?v"
返回
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 10 5 5 4.46 mdi * PB2SGZY
3.3 创建一个索引
curl -X PUT "localhost:9200/customer?pretty"
其中pretty参数表示使用清晰格式
3.4 查看分片状态
curl -X GET "localhost:9200/_cat/indices?v"
返回
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open customer 95SQ4TSUT7mWBT7VNHH67A 5 1 0 0 260b 260b
由于当前只是单机使用,只有本机一个节点没有可以用来备份的机器,健康度为yellow
3.5 索引和查询文档
curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
3.6 删除索引
DELETE /customer?pretty
四、遇到的问题
Ubuntu安装完java8u191之后Java -version依然显示openjdk
解决方法:修改默认使用的jdk
sudo update-alternatives --config java