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 实战》     如有错误,敬请指出,谢谢,与君共勉