Elasticsearch基本概念和简单使用——学习笔记

本文介绍Elasticsearch的基础概念,包括其作为搜索引擎的应用场景、核心组件的理解,并详细解析基本操作如索引管理、文档操作等。

1. es的基本概念

Elasticsearch底层是基于Lucene实现的一个搜索引擎,主要应用于:日志检索、Mysql实时数据快照、分布式文档数据库、搜索引擎等业务场景;
Elasticsearch包含了非常多的名词,想学习Elasticsearch最好先了解一下这些名词是什么意思;

Index 索引:
一个索引(index)就像是RDBS中的数据库,它是相关文档存储的地方;

Type 类型:
可以简单的理解为数据库的表,它存在的初衷是对数据分类;

Document 文档:
Elasticsearch是面向文档的,这意味着索引和搜索数据的最小单位是文档;它类似于数据库中的记录;

Field 字段:
指Document中的某一个数据字段,类似数据库中的列;

Cluster 集群:
表示由多个node组成的ES集群;

Node 节点:
一个安装了ES的服务,如果cluster.name相同,则表示在同一个集群;

shard 分片:
一个Index如果非常大的情况下,可以对一个Index进行分片,以减少磁盘中index的大小;

replica 副本:
在ES集群的情况与,可以将index存在多台机器上,以防止某一台机器宕机造成数据丢失问题;

2. es的基本操作

2.1 Index的基本操作

2.1.1 创建Index:

PUT /student      <1>
{
  "settings": {
    "number_of_shards": 5,     <2>
    "number_of_replicas": 1    <3>
  }
}

<1>:指定创建索引的名称;
<2>:设置索引相关配置,配置索引的分片个数;
<3>:设置每个分片的副本数量;

2.1.2 查询Index:

GET /student

2.1.3 删除Index:

DELETE /student  

2.1.4 查询所有Index

GET _cat/indices

2.2 mapping

2.2.1 Es中的数据类型
分类名称范围备注
字符型text全文检索 将会对field分词
keyword关键词不会对文本进行分词
整数型byte-128~127
short-32768~32767
integer-2^31~2^31-1
long-2^63~2^63-1
浮点型float32位单精度IEEE 754浮点类型占用4字节,也32位
doule64位双精度IEEE 754浮点类型占用8字节,64位
half_float16位半精度IEEE 754浮点类型
scaled_float缩放类型的的浮点数{ "price": { "type": "scaled_float", "scaling_factor": 100 } }
注 对于前三种 -0.0和+0.0是不同的值。 scaled_float指定的比例因子表示price的值会X以100再取一个接近原始值的数存储
时间类型date①格式化的date字符串,例如"2020-10-01"或者"2020-10-01 00:00:00" ②一个long型的数字,代表从1970年1月1号0点到现在的毫秒数 ③一个integer型的数字,代表从1970年1月1号0点到现在的秒数"createTime": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }
布尔类型boolean true/false
二进制类型binary进制字段是指用base64来表示索引中存储的二进制数据
区间类型integer_range例如:"age" : { "gte" : 10, "lte" : 20 }保存值是需要指定范围。格式:"age": { "type": "integer_range" }
float_range
long_range
double_range
date_range
ip_rangeip地址范围
复合类型array[ “one”, “two” ]保存多个值
objectJSON对象
更多数据类型 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
2.2.2 创建索引时指定Mapping
PUT /book
{
	"settings": {
		"number_of_shards": 5,
		"number_of_replicas": 1
	},
	"mappings": {
			"java":{   # type的名称,比如我们创建的type的名称为java
				"properties":{     # 文档存储的field
					"name":{       # field属性名
						"type":"text",
						"analyzer":"ik_max_word",    # 指定分词器
						"index":true,      			 # 指定当前的field可以被作为查询的条件
						"store":false      			 # 是否需要额外存储
	  				 },
					"author":{
						"type":"keyword"
					},
					"count":{
						"type":"long"
					},
					"on-sale":{
						"type":"date",
						"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
					},
					"descr":{
						"type":"text",
						"analyzer":"ik_max_word"
					}
	 			}
			}
	}
}

也可以不指定mapping,不指定的时候默认ES按存储的数据自动生成一个数据类型;
比如上面的mapping中并没有指定price,但添加文档时一样可以添加price,但此时price的类型是由ES自动生成的;

查看mapping:

GET /book/_mapping

修改mapping:
mapping只允许添加某个field的类型,不允许修改某field的类型;原因简单的说就是修改类型影响已经建立的索引;

2.3 Type的基本操作

Type没有什么特别的操作;

有关Type需要多说几句,上面提到过Type类似于数据库中的表,但Type在不同Es版本中有不同的体现: 6.0之后一个Index下能有一个Type,8.0之后去掉了Type;
Type为什么在新版本中会被删除呢?

  1. es中同一个index中不同type是存储在同一个索引中的(lucene的索引文件),因此不同type中相同名字的字段的定义(mapping)必须一致;
  2. 不同类型的“记录”存储在同一个index中,会影响lucene的压缩性能;

2.4 Document的基本操作

2.4.1 向Type中插入文档:

POST /book/java
{
  "name":"es权威指南",
  "author":"clinton gormley,zachary tong",
  "count":1000,
  "on-sale":"2020-10-10",
  "descr":"这是一本关于ES的教程"
}
插入数据时未指定类型的情况下,默认自动生成一个id

POST /book/java/1    # 指定id为1
{
  "name":"java编程思想",
  "author":"java",
  "count":1000,
  "on-sale":"2020-10-10",
  "descr":"这是一本关于java的教程"
}

2.4.2 修改文档:

整个文档修改:
PUT /book/java/1
{
  "name":"java编程思想1",
  "author":"java1",
  "count":1000,
  "on-sale":"2020-10-10",
  "descr":"这是一本关于java的教程1"
}
注意:修改文档的时候用的是PUT请求;

部分Field修改:
POST /book/java/1/_update
{
  "doc":{
    "count":123  # 指定需要修改的field和对应的值
  }
}

2.4.3 删除文档:

DELETE /book/java/1

2.4.4 批量查询文档:

GET /book/java/_mget
{
"ids" : [ "2", "1" ]
}

如果id=2并不存的话,也不影响id=1的查询;

GET /_mget
{
	"docs" : [
		{
			"_index" : "book",
			"_type" : "java",
			"_id" : 1
		},
		{
			"_index" : "book",
			"_type" : "python",
			"_id" : 2,
			"_source": ["name","author"]
		}
	]
}

也可以将不同索引不同type的请求放在一个mget中查询,可以通过_source指定想展示的字段;

2.4.5 批量增删改文档:

POST _bulk
{ "create" : { "_index" : "book","_type" : "java", "_id" : "6" } }   # 指定创建的index和type,如果不指定id依然是自动生成;
{ "name" : "快学java","author":"大牛","count" : 200 }                 # 添加的value
{ "create" : { "_index" : "book","_type" : "java"} } 
{ "name" : "设计模式","author":"大牛" }
{ "update" : { "_index" : "book","_type" : "java", "_id" : "1" } }   # 更新文档   
{ "doc" : {"count" : 200} }											 # 部分更新
{ "delete" : { "_index" : "book","_type" : "java", "_id" : "2" } }   # 删除文档

每个子请求都被独立的执行,所以一个子请求的错误并不影响其它请求。如果任何一个请求失败,顶层的 error 标记将被设置为 true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值