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系列-索引的基本操作相关推荐

  1. elasticsearch 查看索引_ElasticSearch 索引基本操作

    松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程 ElasticSearch 系列第五篇,和大家聊一聊索引的基本操作 ...

  2. elasticsearch 索引_Elasticsearch系列---索引管理

    概要 Elasticsearch让索引创建变得非常简单,只要索引一条新的数据,索引会自动创建出来,但随着数据量的增加,我们开始有了索引优化和搜索优化的需求之后,就会发现自动创建的索引在某些方面不能非常 ...

  3. Elasticsearch 入门到高手的成长阶梯-索引的基本操作(1)

    1. 创建索引 Elasticsearch中索引的名称,必须符合以下要求: 字母只能够是小写字母 不能够包含特殊字符,如\, /, *, ?, ", <, >, |, ` ` , ...

  4. elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))

    目录 一.分词器​ 1. 认识分词器 1.1 Analyzer 分析器 1.2 如何测试分词器 2. 内建的字符过滤器(character filter) 2.1 HTML过滤字符过滤器(HTML S ...

  5. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  6. mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出

    前言 上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识. 作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会了解,尤其是关于索引的内 ...

  7. ElasticSearch系列——Kibana,核心概念

    ElasticSearch系列--Kibana,核心概念 Kibana 下载地址 Windows安装 修改配置文件 启动Kibana 验证 ES核心概念 Index索引 Mapping映射 Docum ...

  8. Elasticsearch系列-搜索操作

    Elasticsearch系列-搜索 指定查询的索引 URl查询 Query String Syntax Request Body查询 sort排序 from,size分页 _source 过滤字段 ...

  9. ElasticSearch核心概念以及基本操作

    一.核心概念 1.1Elasticsearch面向文档.关系行数据库.和Elasticsearch对比 Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这 ...

最新文章

  1. 一次搞懂 Runnable、Callable、Future、FutureTask,不懂不要钱!
  2. 最新阿里内推Java后端面试题
  3. PoolFormer解读
  4. HTML 5 input placeholder 属性
  5. 101_Power Pivot DAX 累计至今,历史累计至今
  6. 19春学期《计算机应用基础》123,福师11春学期《计算机应用基础》在线作业一...
  7. jersey REST的接口简述
  8. HDU 4336 Card Collector:状压 + 期望dp
  9. 【时间序列】动态时间规整(DTW)算法简介(python)
  10. mysql全量备份命令_mysql全量备份与增量备份
  11. Tomcat Caused by:java.lang.IllegalArgumentException: 指定的主资源集[……]无效
  12. [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))...
  13. STM32F4时钟系统说明
  14. uni-app学习笔记--浏览vue-cli创建uni-app模板的文件结构
  15. 数字图像处理学习路线大体介绍
  16. 大文件传输软件的优势你了解吗?
  17. java开发工具-->IDEA
  18. Unity资源包共享
  19. Invalidate()详解
  20. 模型预测控制(MPC)+逻辑控制(相平面分区控制)--matlab例程介绍

热门文章

  1. java 8 第15篇 给定数字,输出先前的所有的质素和非质素(优化)
  2. Linux: 复制文件夹到上一级目录
  3. HITSZ智能证券投资报告(一)
  4. java中this.getclass(),Java中关于this.getClass()与super.getClass()的案例
  5. 给图像马赛克处理的程序c语言,C#中的图像处理(附带生成马赛克范例)
  6. FPGA - Zynq - 加载 - FSBL源码解析1
  7. 【git】Enter passphrase for key 解决本地git 提交需要密钥问题
  8. android全局变量闪退,安卓使用Intent开启照相机拍照时闪退的处理
  9. 通过GooglePlay地区切换实现下载所需的APP
  10. C语言 函数指针和指针函数用法