ElasticSearch
Elasticsearch是一个开源的分布式搜索引擎,它的基于Apache Lucene上,luncene是一个开源的全文检索引擎数据包。elasticsearch在lucene基础上,对其进行扩展,使其搜索,存储更容易,快捷。
安装(不详细介绍)
elasticsearch的安装比较简单,安装完后,如果没有特别的要求,可以直接进行运行而不需要任何配置,通过在浏览localhost:9200站点可以查看具体的elasticsearch实例,以及节点的信息。
[land@localhost ~]$ curl 'localhost:9200'
{
"name" : "3H-Olfl",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "jNAqhTJOS563J1if2VTzWQ",
"version" : {
"number" : "6.5.4",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "d2ef93d",
"build_date" : "2018-12-17T21:17:40.758843Z",
"build_snapshot" : false,
"lucene_version" : "7.5.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
基本概念
⑴节点与集群
一个elasticsearch实例就是一个节点,第一个实例的端口是9200(注:可以在配置文件中进行配置)。在一台主机上,可以启动运行多个实例,当第二个实例运行后,它的端口就是9201,以此类推。多个节点构成一个集群,当然一个节点也可以看做是单节点集群。
⑵索引(逻辑结构)
“索引是映射类型的容器,是独立的大量文档的集合,每个索引存储在磁盘上的同组文件中,索引存储了所有映射类型的字段,以及一些设置”(来自《elasticsearch实战》)。我的理解为:首先我们从数据库的角度理解索引,索引就是所有数据的集合,但是这里的所有数据又不一定是全部数据,例如主键索引,索引只是每个记录的主键,索引数据和真正的数据通过主键来实现映射,索引是用来实现快速的查找定位,在进行索引的时候,而不用查找整个数据集。接下来我们来看看elasticsearch中的索引,这个的索引是文档的集合,文档是elasticsearch用来检索的最小单位,这里的索引实现就是特定的关键字和文档中数据的映射。elasticsearch采用倒排索引,对于搜索还有标签对应的文档,则倒排索引的查找速度更快。
⑶类型(逻辑结构)
类型是具有相似性的文档的集合,当我们通过索引检索数据的时候,索引已经帮我们实现了简化的一部分,但是为了更进一步的缩小查找的范围,elasticsearch将具有相同特性的文档归属为同一个类型,这样可以缩小检索范围,提高查询效率,注意,同种类型的文档在一起,但是在物理存储方面,在一个磁盘存储中,同一个索引下的文档,他们的存储并不是同种类型的数据在一个顺序存储。不同类型的文档并没有物理上的分离,在同一个索引中的所有文档,无论何种类型,都是存储在属于相同分片的同一组文件中,
⑷文档(逻辑结构)
文档是数据存储和检索的最小单位,文档包含特定的字段和他们的取值,可以是嵌套的,即文档的值还是一个字段和值的映射,文档的类型并不要求统一。
⑸分片(物理结构)
对于索引的存储,如果一个索引的大小大于节点所能存储的大小,则会出错,因此,elasticsearch采取的措施是对于索引进行分片,默认的每个索引是分5片,同时有备份,分片可以在任意节点上进行存储。
深入探究
⑴水平扩展和垂直扩展
当进行节点的增加的时候,现有的分片将在所有节点中的索引进行负载均衡,这种称为水平扩展。
增加更多的硬件资源,为虚拟机分配更多的处理器,内存,这种称为垂直扩展。
⑵索引数据
默认情况下,当索引一篇文档的时候,系统根据文档的ID的散列值选择一个主分片,并将文档发送到该分片,然后文档被发送到该主分片的所有副本分片进行索引。
通过使用cURL索引数据,curl是一个命令行工具,通过HTTP协议传输数据,使用方式:
参数-X,是参数值的方法,通常是GET,PUT,POST,默认是GET,可省略-X,而使用-XPUT时,需要标明;
默认的协议是HTTP协议,当使用HTTP协议时,可以跳过该协议的指定;
在URL周围放置单引号,当URI包含多个参数,参数的分隔使用&;
发送JSON格式的数据,需要使用单引号包括;
curl http://localhost:9200/get-together/group/1
命令 协议 节点名称 端口 索引 类型 ID
⑶创建索引
elasticsearch自动添加get-together索引并且为group类型创建一个新的映射。
创建索引:索引名为(new-index),可以随便写。
curl -XPUT 'localhost:9200/new-index'
{"acknowledged":true,"shards_acknowledged":true,"index":"new-index"}
获取映射:(因为在创建的时候没有指定任何类型,所以映射为空)
[land@localhost ~]$ curl 'localhost:9200/new-index/_mapping?pretty'
{
"new-index" : {
"mappings" : { }
}
}
获取数据:(因为new-index索引没有group类型,以及任何映射,所以报错,但索引的格式就是这样书写。
[land@localhost ~]$ curl "localhost:9200/new-index/group/_search?\
> q=elasticearch\
> &fields=name,location\
> &size=1\
> &pretty"
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "request [/new-index/group/_search] contains unrecognized parameter: [fields]"
}
],
"type" : "illegal_argument_exception",
"reason" : "request [/new-index/group/_search] contains unrecognized parameter: [fields]"
},
"status" : 400
}
在指定的类型中进行搜索:
[land@localhost ~]$ curl "localhost:9200/new-index/group,event/_search\
> ?q=elasticsearch&pretty"
在指定的索引中进行搜索:
[land@localhost ~]$ curl "localhost:9200/new-index,other-index/_search\
> ?q=elasticsearch&pretty"
在所有索引中进行搜索:
[land@localhost ~]$ curl "localhost:9200/_search?q=elasticsearch&pretty"
使用JSON格式指定所有的搜索条件:(elasticsearc默认查找_all字段,如果想在 分组的名称里查询,需要指定,同时默认返回匹配了任意一个指定关键词的文档,如果希望匹配所有的关键词,需要指定AND)
[land@localhost ~]$ curl -H "Content-Type:application/json" 'localhost:9200/get-together/group/_search?pretty' -d ' {
"query" : {
"query_string" : {
"query" : "elasticsearch"
}
}
}'
[land@localhost ~]$ curl -H "Content-Type:application/json" 'localhost:9200/get-together/group/_search?pretty' -d '{
"query" : {
"query_string" : {
"query" : "elasticsearch",
"default_field" : "name",
"default_operator" : "AND"
}
}
} '
通过ID获取文档:
[land@localhost ~]$ curl "localhost:9200/get-together/group/1?pretty"
映射:
elasticsearch是基于文档的,文档是由字段和其值组成的。每篇文档都属于一个类型,每种类型都属于一个索引,可以理解成索引是数据库,类型是数据库中的表。类型中包含了映射中每个字段的定义,映射包含了该类型的文档中可能出现的所有字段。elasticsearch通常会实现自动识别字段,并相应的调整映射。这里的映射指的是文档与类型的映射。
⑴获取映射
[land@localhost ~]$ curl 'localhost:9200/get-together/group/_mapping?pretty'
⑵定义映射 (应该发送一个HTTP PUT请求)new-event为类型名
[land@localhost ~]$ curl -H "Content-Type: application/json" -XPUT 'localhost:9200/get-together/_mapping/new-event' -d '{
"new-events" : {
"properties" : {
"host" : {
"type" : "string"
}
}
}
}'
注意:在现有的基础上在设置一个映射,elasticsearch会将两者合并。注意,无法改变现有字段的数据类型,而且通常无法改变一个字段被索引的方式。
数据的类型有字符串,数值,日期,数组,多字段。
参考《Elasticsearch 实战》 如有错误,敬请指出,谢谢,与君共勉