原文:chenmingyu.top/es-basics/html
elasticsearch是一个近实时分布式搜索和分析引擎,它用于全文搜索、结构化搜索、分析以及将这三者混合使用,使用java编写,基于Lucene 实现java
优点:mysql
分布式的实时文件存储,每一个字段都被索引并可被搜索sql
实时分析的分布式搜索引擎json
横向可扩展:支持上百台服务节点的扩展,集群增长机器简单,支持处理PB级数据api
分片机制:数组
容许水平分割扩展数据,容许分片和并行操做从而提升性能和吞吐量数据结构
提供高性能:同一个索引能够分多个主分片(primary shard
),每一个主分片拥有本身的副本分片(replica shard
),每一个副本分片均可以提供服务,提高系统搜索请求的吞吐量和性能并发
提供高可用性:同一个索引能够分多个主分片,每一个主分片拥有零个或者多个副本,若是主分片挂了,能够从副本分片中选择一个做为主分片继续提供服务app
Cluster
:集群
一个集群包含多个节点,对外提供服务,每一个节点属于哪一个集群经过配置文件中的集群名称决定
Node
:节点
集群中的一个节点,每一个节点也有一个名称,默认是随机分配,也能够本身指定,在es集群中经过节点名称进行管理和通讯
Index
:索引
索引是具备相同结构的文档集合,做用至关于mysql中的库
Type
:类型
一个索引能够对应一个或者多个类型,类型能够当作是索引的逻辑分区,做用至关于mysql中的表
Document
:文档
存储在es中的一个JSON
格式的字符串,每个文档有一个文档ID,若是没有本身指定ID,系统会自动生成一个ID,文档的index/type/id必须是惟一的,做用至关于mysql中的行
field
:字段
一个文档会包含多个字段,每一个字段都对应一个字段类型,相似于mysql中的列
shard
:分片
es中分为primary shard
主分片和replica shard
副本分片
主分片:当存一个文档的时候会先存储在主分片中,而后复制到不一样的副本分片中,默认一个索引会有5个主分片,固然能够本身指定分片数量,当分片一旦创建,分片数量不能改变
副本分片:每个主分片会有零个或者多个副本,副本主要是主分片的复制,经过副本分片能够提供高可用性,当一个主分片挂了,能够从副本分片中选择一个做为主分片,还能够提升性能,因此主分片不能和副本分片部署在相同的节点上
replica
:复制
复制是为了防止单点问题,能够作到对故障进行转移,保证系统的高可用
映射
描述数据在每一个字段内如何存储,是定义存储和索引的文档类型及字段的过程,索引中的每个文档都有一个类型,每种类型都有它本身的映射,一个映射定义了文档结构内每一个字段的数据类型
使用GET /index/_mapping/type
获取对应的/index/type
的映射信息
建议安装Elasticsearch+Kibana,在Kibana的操做界面对es进行操做
Elasticsearch提供了RESTful接口能够对Elasticsearch进行操做
Kibana操做页面
在Kibana的Dev Tools界面能够对es进行操做,在console界面敲命令,点执行,会在右面输出结果
验证Elasticsearch是否安装成功
{
"name" : "UzOujcc", //节点名称
"cluster_name" : "mx", //集群名称,我本身设置的
"cluster_uuid" : "d2K1M95DRzG9XOPDOR_DEQ",
"version" : {
"number" : "6.2.4", //集群版本
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
复制代码
es提供了一套api,叫作cat api,能够查看es中的信息数据
查看集群健康情况
命令:GET /_cat/health?v
status
表明着集群的健康程度
green
:每一个索引的primary shard和replica shard都是active状态的yellow
:每一个索引的primary shard都是active状态的,可是部分replica shard不是active状态,处于不可用的状态red
:不是全部索引的primary shard都是active状态的,部分索引有数据丢失了命令:GET _cat/indices?v
有五个索引,都是的测试数据
命令:PUT /myindex
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "myindex"
}
复制代码
命令:DELETE myindex
{
"acknowledged": true
}
复制代码
添加文档是向索引中添加一条文档,让其可以搜索,文档格式是json串,若是es中有相同id的文档存在则更新这个文档
当建立文档的时候,若是索引不存在,则会自动建立该索引,并且es默认会对document每一个field都创建倒排索引,让其能够被搜索
命令:
PUT /index/type/id
{
"json数据结构体 "
}
复制代码
例:
PUT /school/student/1
{
"name":"张三",
"age":21,
"class":2,
"gender":"男"
}
复制代码
返回:
{
"_index": "school", //索引
"_type": "student", //类型
"_id": "1", //id,若是不指定则会系统生成一个20位的id,文档被分到那个分片上就是根据id的散劣值进行控制
"_version": 1, //文档版本号,经过这个进行并发控制
"result": "created", //操做类型
"_shards": { //分片信息
"total": 2, //文档被建立时在多少个分片进行了操做(包括主分片和副本分片)
"successful": 1, //添加成功的索引分片数量
"failed": 0 //失败的索引分片数量
},
"_seq_no": 0,
"_primary_term": 1
}
复制代码
方式1:使用put方式更新文档
PUT /school/student/1
{
"name":"吕布",
"age":21,
"class":2,
"gender":"男"
}
复制代码
返回:
{
"_index": "school",
"_type": "student",
"_id": "1",
"_version": 2, //版本号+1
"result": "updated", // 修改
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
复制代码
这种方式替换须要带上全部的field,才能进行信息的修改,操做相似于覆盖
方式2:post更新文档
POST /school/student/1/_update
{
"doc": {
"name":"吕布1"
}
}
复制代码
使用post更新文档,能够只更新部分字段
查询单条文档
命令:GET /school/student/1
返回:
{
"_index": "school",
"_type": "student",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"name": "吕布1",
"age": 21,
"class": 2,
"gender": "男"
}
}
复制代码
命令:DELETE school/student/1
返回:
{
"_index": "school",
"_type": "student",
"_id": "1",
"_version": 4,
"result": "deleted", //删除
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
复制代码
这时在查询就会显示"found": false
es中的映射(mapping
)用来描述数据在每一个字段内如何存储,是定义存储和索引的文档类型及字段的过程,索引中的每个文档都有一个类型,每种类型都有它本身的映射,一个映射定义了文档结构内每一个字段的数据类型,做用至关于mysql
中的DDL
语句
GET /ad/_mapping/phone
{
"school": {
"mappings": {
"student": {
"properties": {
"age": {
"type": "long"
},
"class": {
"type": "long"
},
"gender": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
复制代码
动态映射不须要事先定义映射,文档在写入es的时候,会根据文档字段自动识别类型
映射规则:
Json 数据类型 | es 数据类型 |
---|---|
null | 没有字段添加 |
true,false | boolean |
Integer | long |
object | object |
array | 依赖于数组中首个非空值 |
string | text和keyword |
日期 | date或text |
静态映射须要事先定义好映射,包含文档的各个字段及其类型
PUT books
{
"mappings": {
"book":{
"properties": {
"id":{"type": "long"},
"bookName":{"type": "text"},
"ad":{"type": "text"}
}
}
}
}
复制代码
Elasticsearch 中的数据能够归纳的分为两类:精确值和全文
Foo
和 foo
是不一样的,精确值的查询简单,要么匹配查询,要么不匹配在es中使用 倒排索引来进行快速的全文搜索。一个倒排索引由文档中全部不重复词的列表构成,对于其中每一个词,有一个包含它的文档列表,倒排索引具体内容请戳:www.elastic.co/guide/cn/el…
es中的字符串类型分为keyword
和text
keyword
:用于索引结构化内容的字段,例如电子邮件地址,主机名,状态代码,邮政编码或标签。它们一般用于过滤,排序,和聚合。keyword字段只能按其确切值进行搜索。若是您须要索引电子邮件正文或产品说明等全文内容,则可能应该使用text字段text
:用于索引全文值的字段,例如电子邮件正文或产品说明。这些字段是analyzed,它们经过分词器传递 ,以在被索引以前将字符串转换为单个术语的列表。分析过程容许Elasticsearch搜索单个单词中 每一个完整的文本字段。文本字段不用于排序,不多用于聚合有时候一个字段同时拥有全文类型(text)和关键字类型(keyword)是有用的:一个用于全文搜索,另外一个用于聚合和排序。这能够经过多字段类型来实现(动态映射是字符串的默认映射类型)
参考: Elasticsearch: 权威指南 www.elastic.co/guide/cn/el…