历史文章(文章累计500+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
Elasticsearch可视化平台Kibana [ES系列] - 第498篇
Elasticsearch安装分词插件[ES系列] - 第499篇
ElasticSearch扫盲概念篇[ES系列] - 第500篇
导读
Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。
这一节来看看ES的索引的基本操作 – 增删改查。
一、索引操作
1.1 创建索引
格式: PUT /索引名称
索引命名规范:
·以小写英文字母命名索引
·不要使用驼峰命名法则
·如过出现多个单词的索引名称,以全小写 + 下划线分隔的方式:如test_index。
ES 索引创建成功之后,以下属性将不可修改
·索引名称
·主分片数量
·字段类型
举例说明:
#创建索引
PUT /es_db
1.2查询索引
格式: GET /索引名称
#查询索引
GET /es_db
1.3删除索引
格式: DELETE /索引名称
DELETE /es_db
二、设置 Settings
创建索引的时候指定 settings
<span style="color:#333333"><span style="background-color:#fafafa"><code>PUT <index_name></code><code>{</code><code> <span style="color:#dd1144">"settings"</span>: {}</code><code>}</code><code></code></span></span>
创建索引时可以设置分片数和副本数
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#创建索引es_db,指定其主分片数量为 3,每个主分片的副本数量为 2</em></span></code><code>PUT /es_db</code><code>{</code><code> <span style="color:#dd1144">"settings"</span>: {</code><code> <span style="color:#dd1144">"number_of_shards"</span>: 3,</code><code> <span style="color:#dd1144">"number_of_replicas"</span>: 2</code><code> }</code><code>}</code><code></code></span></span>
说明:
(1)静态索引设置:只能在创建索引时或在关闭状态的索引上设置。
- index.number_of_shards:索引的主分片的个数,默认为 1,此设置只能在创建索引时设置。
(2)动态索引设置:即可以使用 _setting API 在实时修改的配置项。
- index.number_of_replicas:每个主分片的副本数。默认为 1,允许配置为 0。
- index.refresh_interval:执行刷新操作的频率,默认为1s. 可以设置 -1 为禁用刷新。
- index.max_result_window:from + size 搜索此索引 的最大值,默认为 10000。
使用 _setting 只能修改允许动态修改的配置项
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#修改索引配置,把每个主分片的副本数量修改为 1</em></span></code><code>PUT /es_db/_settings</code><code>{</code><code><span style="color:#dd1144">"index"</span> : {</code><code><span style="color:#dd1144">"number_of_replicas"</span> : 1</code><code>}</code><code>}</code><code></code></span></span>
创建索引时可以指定IK分词器作为默认分词器
<span style="color:#333333"><span style="background-color:#fafafa"><code>PUT /es_db</code><code>{</code><code> <span style="color:#dd1144">"settings"</span> : {</code><code> <span style="color:#dd1144">"index"</span> : {</code><code> <span style="color:#dd1144">"analysis.analyzer.default.type"</span>: <span style="color:#dd1144">"ik_max_word"</span></code><code> }</code><code> }</code><code>}</code><code></code></span></span>
三、设置文档映射Mapping
ES 中的 mapping 有点类似与关系数据库中表结构的概念,在 MySQL 中,表结构里包含了字段名称,字段的类型还有索引信息等。在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在 ES 中一个字段可以有多个类型。ES中Mapping可以分为动态映射和静态映射。
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#查看完整的索引 mapping</em></span></code><code>GET <span style="color:#dd1144">/<index_name>/_mappings</span></code><code></code><code><span style="color:#afafaf"><em>#查看索引中指定字段的 mapping</em></span></code><code>GET <span style="color:#dd1144">/<index_name>/_mappings/field/<field_name></span></code><code></code></span></span>
mapping 的使用禁忌
·ES 没有隐式类型转换
·ES 不支持类型修改
·生产环境尽可能的避免使用 动态映射(dynamic mapping)
3.1动态映射
在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射,在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。
示例:
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#删除原索引</em></span></code><code><span style="color:#ca7d37">DELETE</span> /<span style="color:#ca7d37">user</span></code><code></code><code><span style="color:#afafaf"><em>#创建文档(ES根据数据类型, 会自动创建映射)</em></span></code><code>PUT /<span style="color:#ca7d37">user</span>/_doc/<span style="color:#0e9ce5">1</span></code><code>{</code><code> <span style="color:#dd1144">"name"</span>: <span style="color:#dd1144">"fox"</span>,</code><code> <span style="color:#dd1144">"age"</span>: <span style="color:#0e9ce5">32</span>,</code><code> <span style="color:#dd1144">"address"</span>:<span style="color:#dd1144">"长沙麓谷"</span></code><code>}</code><code></code><code><span style="color:#afafaf"><em>#获取文档映射</em></span></code><code><span style="color:#ca7d37">GET</span> /<span style="color:#ca7d37">user</span>/_mapping</code><code></code></span></span>
3.2静态映射
静态映射也叫做显式映射,即:在索引文档写入之前,人为创建索引并且指定索引中每个字段类型、分词器等参数。
<span style="color:#333333"><span style="background-color:#fafafa"><code>PUT /user</code><code>{</code><code> <span style="color:#dd1144">"settings"</span>: {</code><code> <span style="color:#dd1144">"number_of_shards"</span>: <span style="color:#dd1144">"1"</span>,</code><code> <span style="color:#dd1144">"number_of_replicas"</span>: <span style="color:#dd1144">"1"</span></code><code> },</code><code> <span style="color:#dd1144">"mappings"</span>: {</code><code> <span style="color:#dd1144">"properties"</span>: {</code><code> <span style="color:#dd1144">"name"</span>: {</code><code> <span style="color:#dd1144">"type"</span>: <span style="color:#dd1144">"keyword"</span></code><code> },</code><code> <span style="color:#dd1144">"age"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"long"</span></code><code> },</code><code> <span style="color:#dd1144">"address"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"text"</span></code><code> }</code><code> }</code><code> }</code><code>}</code><code></code></span></span>
3.3常用Mapping参数配置
参数名称 | 释义 |
analyzer | 指定分析器,只有 text 类型字段支持。 |
copy_to | 该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询 |
dynamic | 控制是否可以动态添加新字段,支持以下四个选项: true:(默认)允许动态映射 false:忽略新字段。这些字段不会被索引或搜索,但仍会出现在_source返回的命中字段中。这些字段不会添加到映射中,必须显式添加新字段。 runtime:新字段作为运行时字段添加到索引中,这些字段没有索引,是_source在查询时加载的。 strict:如果检测到新字段,则会抛出异常并拒绝文档。必须将新字段显式添加到映射中。 |
doc_values | 为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持 text 和 annotated_text) |
eager_global_ordinals | 用于聚合的字段上,优化聚合性能。 |
enabled | 是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,任然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。 |
fielddata | 查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中 |
fields | 给 field 创建多字段,用于不同目的(全文检索或者聚合分析排序) |
format | 用于格式化代码,如 "data":{ "type": "data", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } |
index | 是否对创建对当前字段创建倒排索引,默认 true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在 source 元数据中展示。 |
norms | 是否禁用评分(在filter和聚合字段上应该禁用) |
null_value | 为 null 值设置默认值 |
search_analyzer | 设置单独的查询时分析器 |
示例:
- index: 控制当前字段是否被索引,默认为true。如果设置为false,该字段不可被搜索
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#ca7d37">DELETE</span> /<span style="color:#ca7d37">user</span></code><code>PUT /<span style="color:#ca7d37">user</span></code><code>{</code><code> <span style="color:#dd1144">"mappings"</span> : {</code><code> <span style="color:#dd1144">"properties"</span> : {</code><code> <span style="color:#dd1144">"address"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"text"</span>,</code><code> <span style="color:#dd1144">"index"</span>: <span style="color:#0e9ce5">false</span></code><code> },</code><code> <span style="color:#dd1144">"age"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"long"</span></code><code> },</code><code> <span style="color:#dd1144">"name"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"text"</span></code><code> }</code><code> }</code><code> }</code><code>}</code><code></code><code>PUT /<span style="color:#ca7d37">user</span>/_doc/<span style="color:#0e9ce5">1</span></code><code>{</code><code> <span style="color:#dd1144">"name"</span>:<span style="color:#dd1144">"fox"</span>,</code><code> <span style="color:#dd1144">"address"</span>:<span style="color:#dd1144">"广州白云山公园"</span>,</code><code> <span style="color:#dd1144">"age"</span>:<span style="color:#0e9ce5">30</span></code><code>}</code><code></code><code><span style="color:#ca7d37">GET</span> /<span style="color:#ca7d37">user</span></code><code></code><code><span style="color:#ca7d37">GET</span> /<span style="color:#ca7d37">user</span>/_search</code><code>{</code><code> <span style="color:#dd1144">"query"</span>: {</code><code> <span style="color:#dd1144">"match"</span>: {</code><code> <span style="color:#dd1144">"address"</span>: <span style="color:#dd1144">"广州"</span></code><code> }</code><code> }</code><code>}</code><code></code></span></span>
四、使用ReIndex重建索引
具体方法:
具体方法:
1)如果要推倒现有的映射, 你得重新建立一个静态索引
2)然后把之前索引里的数据导入到新的索引里
3)删除原创建的索引
4)为新索引起个别名, 为原索引名
通过这几个步骤可以实现了索引的平滑过渡,并且是零停机
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em># 1. 重新建立一个静态索引</em></span></code><code>PUT /user2</code><code>{</code><code> <span style="color:#dd1144">"mappings"</span>: {</code><code> <span style="color:#dd1144">"properties"</span>: {</code><code> <span style="color:#dd1144">"name"</span>: {</code><code> <span style="color:#dd1144">"type"</span>: <span style="color:#dd1144">"text"</span></code><code> },</code><code> <span style="color:#dd1144">"address"</span>: {</code><code> <span style="color:#dd1144">"type"</span>: <span style="color:#dd1144">"text"</span>,</code><code> <span style="color:#dd1144">"analyzer"</span>: <span style="color:#dd1144">"ik_max_word"</span></code><code> }</code><code> }</code><code> }</code><code>}</code><code></code><code><span style="color:#afafaf"><em># 2. 把之前索引里的数据导入到新的索引里</em></span></code><code>POST _reindex</code><code>{</code><code> <span style="color:#dd1144">"source"</span>: {</code><code> <span style="color:#dd1144">"index"</span>: <span style="color:#dd1144">"user"</span></code><code> },</code><code> <span style="color:#dd1144">"dest"</span>: {</code><code> <span style="color:#dd1144">"index"</span>: <span style="color:#dd1144">"user2"</span></code><code> }</code><code>}</code><code><span style="color:#afafaf"><em># 3. 删除原创建的索引</em></span></code><code>DELETE /user</code><code><span style="color:#afafaf"><em># 4. 为新索引起个别名, 为原索引名</em></span></code><code>PUT /user2/_alias/user</code><code></code><code>GET /user</code><code></code></span></span>
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟纤学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7