一、进阶检索
1、Mapping
1)、字段类型
一、数据类型
字段类型概述
一级分类 |
二级分类 |
具体类型 |
描述 |
核心类型 |
字符串类型 |
string,text,keyword |
|
整数类型 |
integer,long,short,byte |
||
浮点类型 |
double,float,half_float,scaled_float |
||
逻辑类型 |
boolean |
||
日期类型 |
date |
||
范围类型 |
range |
||
二进制类型 |
binary |
||
复合类型 |
数组类型 |
array |
|
对象类型 |
object |
||
嵌套类型 |
nested |
||
地理类型 |
地理坐标类型 |
geo_point |
用于描述经纬度坐标 |
地理地图 |
geo_shape |
用于描述复杂形状,如多边形 |
|
特殊类型 |
IP类型 |
ip |
用于描述ipv4 和 ipv6 地址 |
范围类型 |
completion |
提供自动完成提示 |
|
令牌计数类型 |
token_count |
用于统计字符串的词条数量 |
|
附件类型 |
attachment |
参考 mapper-attachments 插件,支持将附件如 Microsoft Office格式,ePub ,HTML 等等索引为attachment数据类型 |
|
抽取类型 |
percolator |
接受特定领域查询语言(query-dsl)的查询 |
|
多字段 通常用于为不同目的用不同的方法索引同一个字段,例如,string字段可以映射为一个text字段用于全文检索,同样可以映射为一个keyword字段用于排序和聚合。另外,你可以使用standard analyzer, english analyzer , french analyzer 来索引一个text字段,这就是muti-fields的目的,大多数的数据类型通过fields参数来支持muti-fields。 |
2)、映射
Mapping(映射)
Mapping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。比如,使用mapping来定义:
- 哪些字符串属性应该被看做全文本属性(full text fields)。
- 哪些属性包含数字,日期或者地理位置。
- 文档中的所有属性是否都能被索引(_all 配置)。
- 日期的格式。
- 自定义映射规则来执行动态添加属性。
- 查看mapping信息
GET bank/_mapping
- 修改mapping信息
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
自动猜测的映射类型
JSON type |
域 type |
布尔型:true 或者 false |
boolean |
整数:123 |
long |
浮点型:123.45 |
double |
字符串,有效日期:2014-09-15 |
date |
字符串:foo bar |
string |
3)、新版本的改变
Es7 及以上移除了type的概念。
- 关系型数据库中两个数据表示是独立的,即使他们里面有相同名称的列也不影响使用,但ES中不是这样的。elasticsearch是基于Lucene开发的搜索引擎,而ES中不同type下名称相同的filed最终在Lucene中的处理方式是一样的。
1 两个不同type下的两个user_name,在ES同一个索引下其实被认为是同一个filed,你必须在两个不同的type中定义相同的filed映射。否则,不同type中的相同字段名称就会在处理中出现冲突的情况,导致Lucene处理效率下降。去掉type能够使数据存储在独立的index中,这样即使有相同的字段名称也不会出现冲突,就像ElasticSearch出现的第一句话一样“你知道的,为了搜索····”。
2 去掉type就是为了提高ES处理数据的效率。
Elasticsearch 7.x
- URL中的type参数为可选。比如,索引一个文档不再要求提供文档类型。
Elasticsearch 8.x
- 不再支持URL中的type参数。
解决:
- 将索引从多类索引迁移到单类型,每种类型文档一个独立索引
- 将已存在的索引下的类型数据,全部迁移到指定位置即可。
1、 创建映射
PUT /my_index { "mappings": { "properties": { "age":{"type": "integer"}, "email":{"type":"keyword"}, "name":{"type": "text"} } } }
2、 添加新的字段映射
PUT /my_index/_mapping { "properties":{ "employee-id":{ "type":"keyword", "index":false } } }
3、更新映射
对于已存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁移。
4、 数据迁移
先创建出new_twitter的正确映射。然后使用如下方式进行数据迁移
POST_reindex [固定写法] { “source”:{ "index":"twitter" }, "dest":{ "index":"new_twitter" } } |
将旧索引的type下的数据进行迁移 POST_reindex { “source:{ "index":"twitter", "type":"tweet" }, "dest":{ "index":"tweets" } } |