Elasticsearch系列-索引的基本操作
Elasticsearch索引的基本操作
- 前言
- 索引基本操作
- 创建索引
- 常用数据类型
- keyword
- text
- 数值类型
- boolean
- date
- 数组类型
- 对象类型
- nested
- 地理类型:geo_point
- 查询指定半径内的数据信息
- Mapping
- 查看mapping
- 扩展映射(mapping)
- 动态映射
- 动态模板
- 多字段
- 别名Alias
- 关闭、打开、删除索引
前言
目标:通过分词能达到预期的数据检索结果,并能完成数据的统计分析
ES版本:7.10.2
客户端语言:DSL、Java
针对Java 使用的是spring-data-elasticsearch-4.2.x框架
索引基本操作
创建索引
PUT /hotel
{"settings": {"number_of_shards": 1,"number_of_replicas": 1}, "mappings": {"properties": {"title":{"type": "text"},"city":{"type": "keyword"},"price":{"type": "double"}}}
}
常用数据类型
keyword
不对数据进行分词操作,可用于业务ID,状态码等字段
text
会对数据进行分词操作
数值类型
ES提供了丰富的数值类型:long、integer、short、byte、double、float.
在实际使用的过程中,在满足需求的情况下尽可能选择范围小的数据类型
boolean
date
日期类型,ES中存储的日期是标准的UTC格式
默认格式为strict_date_optional_time||epoch_millis。其中,strict_date_optional_time的含义是严格的时间类型,支持yyyy-MM-dd、yyyyMMdd、yyyyMMddHHmmss、yyyy-MM-ddTHH:mm:ss、yyyy-MM-ddTHH:mm:ss.SSS和yyyy-MM-ddTHH:mm:ss.SSSZ等格式,epoch_millis的含义是从1970年1月1日0点到现在的毫秒数
可以看出默认是不支持yyyy-MM-dd HH:mm:ss格式的,如果需要这种格式需要手动设置
POST /hotel/_mapping
{"properties": {"create_time":{"type": "date","format": "yyyy-MM-dd HH:mm:ss"}}
}
数组类型
ES没有明确的数组类型,只需在赋值的时候指定数组数据就可以
在指定数据类型时,指定数据里元素的类型就可以了
POST /hotel/_mapping
{"properties": {"tag":{"type": "keyword"}}
}
对象类型
内部对象类型.
POST /hotel/_mapping
{"properties": {"comment_info":{"properties": {"favourable_comment":{"type": "long"},"nagative_coomment":{"type": "long"}}}}
}
需要特别注意的是:如果是一个对象数组,那一个对象里的关系将会被打散丢失,这个时候就推荐使用nested类型
nested
nested
是一个特殊的对象类型,当在索引对象数组的时候,会保留每个对象的关系.
我们先看下普通的对象数组在索引时时如何存储的,比如用户数组,用户包含first和last两个属性
PUT my-index-000001/_doc/1
{"group" : "fans","user" : [ {"first" : "John","last" : "Smith"},{"first" : "Alice","last" : "White"}]
}
这个文档将会被转换成类似下面的文档,John 与 Smith的关系被打散丢失了.
{"group" : "fans","user.first" : [ "alice", "john" ],"user.last" : [ "smith", "white" ]
}
当查询同时满足first=alice and last=smith时,这个文档也会被命中返回
GET my-index-000001/_search
{"query": {"bool": {"must": [{ "match": { "user.first": "Alice" }},{ "match": { "user.last": "Smith" }}]}}
}
这个时候nested
就派上用场了,他会维持对象里的各关系.
PUT my-index-000001
{"mappings": {"properties": {"user": {"type": "nested" }}}
}
PUT my-index-000001/_doc/1
{"group" : "fans","user" : [{"first" : "John","last" : "Smith"},{"first" : "Alice","last" : "White"}]
}# 由于不存在Alice和Smith的人,所以不会命中任何文档
GET my-index-000001/_search
{"query": {"nested": {"path": "user","query": {"bool": {"must": [{ "match": { "user.first": "Alice" }},{ "match": { "user.last": "Smith" }} ]}}}}
}
# 返回匹配的文档
GET my-index-000001/_search
{"query": {"nested": {"path": "user","query": {"bool": {"must": [{ "match": { "user.first": "Alice" }},{ "match": { "user.last": "White" }} ]}},"inner_hits": { "highlight": {"fields": {"user.first": {}}}}}}
}
地理类型:geo_point
移动互联网时代,根据位置来获取数据的应用非常之多
POST /hotel/_mapping
{"properties": {"location": {"type": "geo_point" }}
}
查询指定半径内的数据信息
TODO 待补
Mapping
查看mapping
# 查看mapping
GET /hotel/_mapping
# 查看setting
GET /hotel/_settings
扩展映射(mapping)
- 针对已有的字段是不能修改类型的,这是ES的底层设计所决定的。
- 如果实在想修改,那就需要通过创建一个新的索引来达到这个目的,同时为了索引的无感切换,最好为索引指定 别名(Alias) 。
- 扩展映射使用的是
POST
请求
POST /hotel/_mapping
{"properties": {"tag":{"type": "keyword"},"create_time":{"type": "date"},"comment_info":{"properties": {"favourable_comment":{"type": "long"},"nagative_coomment":{"type": "long"}}},"location": {"type": "geo_point" }}
}
动态映射
如果没有定义任何字段的类型,那在索引文档的时候,ES会猜测这个字段的类型,当然一般不建议这么做,一旦动态映射生成的字段类型与预期的不一致,将不可修改.
动态模板
可自定义字段映射的类型.
在下面的场景中,Report中有一个键值对,value是IndexInfo类型,但是key是不确定的,所以在指定mapping时使用了动态模板的方式来指定字段映射的类型.
public class IndexInfo {/*** 原始编码**/private String sourceCode;/*** 数值 指标值**/private Double numValue;/*** 字符串 指标值**/private String strValue;/*** 单位**/private String unit;
}
public class Report {/*** 指标值信息* key: 指标* value: 指标信息**/private Map<String, IndexInfo> indexItems;}
POST /hotel/_mapping
{"dynamic_templates": [{"number_type": {"mapping": {"type": "double"},"path_match": "indexItems.*.numValue"}},{"other_index_item_type": {"mapping": {"type": "keyword"},"path_match": "indexItems.*.*"}}]
}
多字段
针对同一个字段,有时需要不同的数据类型,这通常表现在为了不同的目的以不同的方式索引相同的字段.
POST /hotel/_mapping
{"properties": {"name":{"type": "text","fields": {"keyword": {"type": "keyword","ignore_above" : 256}}}}
}
别名Alias
- 为索引添加别名,就像给他找了一个代理人。我们要做的就是跟代理人打交道,就算代理人炒了他的老板跟我们也没有任何关系,反正就认定你了…
- 强烈建议为每位老板配一个代理
- 一个代理人可代理多个老板,但是如果涉及到需要老板签字盖章的时候(数据写入),他还没那么智能不清楚到底哪一位老板来签字盖章,这时就需要在添加代理人的时候明确告诉他了(通过is_write_index来指定)
POST /_aliases
{"actions": [{"add": { //添加别名"index": "test1", "alias": "alias1","is_write_index": true},"remove": { //移除别名"index": "","alias": ""}}]
}
关闭、打开、删除索引
# 关闭索引. 关闭索引后,就不能进行数据写入和搜索了,可以用于在某一段时间内属于冷数据或归档的数据
POST /hotel/_close
# 打开索引
POST /hotel/_open
#删除索引
DELETE /hotel
Elasticsearch系列-索引的基本操作相关推荐
- elasticsearch 查看索引_ElasticSearch 索引基本操作
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程 ElasticSearch 系列第五篇,和大家聊一聊索引的基本操作 ...
- elasticsearch 索引_Elasticsearch系列---索引管理
概要 Elasticsearch让索引创建变得非常简单,只要索引一条新的数据,索引会自动创建出来,但随着数据量的增加,我们开始有了索引优化和搜索优化的需求之后,就会发现自动创建的索引在某些方面不能非常 ...
- Elasticsearch 入门到高手的成长阶梯-索引的基本操作(1)
1. 创建索引 Elasticsearch中索引的名称,必须符合以下要求: 字母只能够是小写字母 不能够包含特殊字符,如\, /, *, ?, ", <, >, |, ` ` , ...
- elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))
目录 一.分词器 1. 认识分词器 1.1 Analyzer 分析器 1.2 如何测试分词器 2. 内建的字符过滤器(character filter) 2.1 HTML过滤字符过滤器(HTML S ...
- Git学习系列之Git基本操作提交项目(图文详解)
前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...
- mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出
前言 上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识. 作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会了解,尤其是关于索引的内 ...
- ElasticSearch系列——Kibana,核心概念
ElasticSearch系列--Kibana,核心概念 Kibana 下载地址 Windows安装 修改配置文件 启动Kibana 验证 ES核心概念 Index索引 Mapping映射 Docum ...
- Elasticsearch系列-搜索操作
Elasticsearch系列-搜索 指定查询的索引 URl查询 Query String Syntax Request Body查询 sort排序 from,size分页 _source 过滤字段 ...
- ElasticSearch核心概念以及基本操作
一.核心概念 1.1Elasticsearch面向文档.关系行数据库.和Elasticsearch对比 Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这 ...
最新文章
- 一次搞懂 Runnable、Callable、Future、FutureTask,不懂不要钱!
- 最新阿里内推Java后端面试题
- PoolFormer解读
- HTML 5 input placeholder 属性
- 101_Power Pivot DAX 累计至今,历史累计至今
- 19春学期《计算机应用基础》123,福师11春学期《计算机应用基础》在线作业一...
- jersey REST的接口简述
- HDU 4336 Card Collector:状压 + 期望dp
- 【时间序列】动态时间规整(DTW)算法简介(python)
- mysql全量备份命令_mysql全量备份与增量备份
- Tomcat Caused by:java.lang.IllegalArgumentException: 指定的主资源集[……]无效
- [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))...
- STM32F4时钟系统说明
- uni-app学习笔记--浏览vue-cli创建uni-app模板的文件结构
- 数字图像处理学习路线大体介绍
- 大文件传输软件的优势你了解吗?
- java开发工具-->IDEA
- Unity资源包共享
- Invalidate()详解
- 模型预测控制(MPC)+逻辑控制(相平面分区控制)--matlab例程介绍
热门文章
- java 8 第15篇 给定数字,输出先前的所有的质素和非质素(优化)
- Linux: 复制文件夹到上一级目录
- HITSZ智能证券投资报告(一)
- java中this.getclass(),Java中关于this.getClass()与super.getClass()的案例
- 给图像马赛克处理的程序c语言,C#中的图像处理(附带生成马赛克范例)
- FPGA - Zynq - 加载 - FSBL源码解析1
- 【git】Enter passphrase for key 解决本地git 提交需要密钥问题
- android全局变量闪退,安卓使用Intent开启照相机拍照时闪退的处理
- 通过GooglePlay地区切换实现下载所需的APP
- C语言 函数指针和指针函数用法