一、介绍
ElasticSearch是一个开源的高拓展的分布式全文检索引擎,它可以近乎实时地存储、检索数据。拓展性很好,可以拓展到处理PB级别的数据。
ElasticSearch使用Java开发并使用Lucene作为其核心来实现所有的索引和搜索的功能。ElasticSearch通过简单的RESTFul API来隐藏Lucene的复杂性,从而使得全文检索变得简单。
二、ElasticSearch核心概念
(1)Cluster(集群)
ElasticSearch可以作为单节点的搜索服务器,但是,为了处理海量数据,实现高可用和容错,可以运行在集群上。
(2)Node(节点)
形成集群的单个服务器。
(3)Shard(分片)
当有大量的文档时,由于内存、磁盘的限制,无法足够快地响应客户端的请求,这种情况下,数据可以分为较小的数据集,放在不同的服务器上。
当索引分布在不同的分片上时,ES会查询发送给每个相关的分片,并将结果组合在一起,应用无感知。
(4)Replia(副本)
为提高查询吞吐量,实现高可用性,可以使用分片副本。
副本是一个分片的精确复制,每个分片可以有0个或多个副本,ES可以有很多相同的分片,其中之一被选择更改索引操作,这种特殊的分片被称为主分片。当主分片丢失(如主分片数据不可用)时,集群将副本提升为新的主分片。
(5)全文检索
全文检索就是对所有数据索引,可以根据关键字搜索,类似于Sql里的like。
全文索引就是把内容根据词的意义进行分词,然后分别创建索引。
三、ElasticSearch和Mysql概念对比
★ 关系型数据库中,schema定义了表、每个表的字段,还有表与字段之间的关系。与之对应的,ES中Mapping定义了索引下的类型的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档,是否压缩原始JSON文档,是否需要分词处理,如何进行分词处理等。
★ 在数据库中的insert,delete,update,search操作等价于ES中的增(PUT/POST),删(Delete),改(_update),查(GET)。
四、安装ElasticSearch和head
我参考的是这篇博客:
Windows10搭建ElasticSearch 并配置head
通过elasticsearch-6.2.3\bin\elasticsearch.bat启动ElasticSearch,在elasticsearch-6.2.3\elasticsearch-head-master目录下执行grunt server启动head。
五、使用REST API操作ElasticSearch
ElasticSearch提供了基于JSON的REST API与其通信,可以使用任何http客户端。
我widows本地装了个ES,用的POST MAN发请求。
(1)_search可以匹配所有文档,我没有指定索引和类型,所以localhost:9200/_search查的是所有的文档
● took:请求耗时; time_out:是否超时;_shards:分片情况;hits:查询结果
请求GET localhost:9200/_cat/indices可以查看当前节点所有的索引。
(2)创建索引
ElasticSearch会索引所有的字段,经过处理后写入一个反向索引(Inverted Index)。查库的时候直接查找该索引。
所以,ElasticSearch数据库管理的 顶层单位就叫索引(Index),等于单个数据库。每个库(Index)的名字必须小写。
如下请求创建一个索引:
PUT localhost:9200/<index>/
返回JSON里的acknowledged表示操作是否成功。
(3)删除索引
DELETE localhost:9200/<index>
(4)创建文档
POST localhost:9200/<index>/<type>/[<id>]
PUT localhost:9200/<index>/<type>/<id>
索引和类型是必须的,POST请求的id可以省略,es会自动生成一个随机id。id可以是数字可以是字符串。
创建文档的前提是索引存在,否则会报错。
通过localhost:9200/_search 命令查看所有数据,可以找到新put的数据:
(5)查看文档
GET localhost:9200/<index>/<type>/<id>/
(6)删除文档
DELETE localhost:9200/<index>/<type>/<id>
(7)更新文档
PUT localhost:9200/<index>/<type>/<id>
update就是指定索引、文档、id重新PUT一次数据。
从返回JSON可以看到,_version变成了2,result为updated。
六、数据查询
(1)返回所有记录:_search
GET localhost:9200/<index>/_search
GET localhost:9200/<index>/<type>/_search
返回的JSON中 :
took - 耗时(单位:毫秒),
time_out - 是否超时,
hit - 命中记录,
total - 返回记录数,
max_score - 最高匹配程度,
_score - 匹配程度,每条记录都有一个_score,默认按照这个字段降序排序。
(2)全文搜索
⒈ match查询:匹配“字段”等于“值”的数据
POST localhost:9200/<index>/<type>/_scarch
{
"query" : { "match" : {"字段" : "值"} }
}
★ ElasticSearch默认最大返回10条结果,可以通过size修改最大返回结果数:
POST localhost:9200/<index>/<type>/_scarch
{
"query" : { "match" : {"字段" : "值"} },
"size" : 1
}
可以通过from指定位移:
POST localhost:9200/<index>/<type>/_scarch
{
"query" : { "match" : {"字段" : "值"} },
"size" : 1,
"from" 1
}
上面查询意为,从位置1开始(默认0),值返回一条结果。
(3)逻辑运算
如果有多个关键字,ElasticSearch认为它是“or”关系
POST localhost:9200/accounts/person/_search
{
"query" : { "match" : { "desc" : "软件 系统" }}
}
如果要执行and需使用布尔查询
POST localhost:9200/accounts/person/_search
{
"query": {
"bool": {
"must": [
{ "match": { "desc": "软件" } },
{ "match": { "desc": "系统" } }
]
}
}
}