前言
1、字段类型
在 Elasticsearch (ES) 中,字段类型定义了数据的格式和如何索引与存储字段的内容。每个字段都有一个类型,这决定了它如何在索引中存储、搜索和聚合。
这些数据类型可以组合使用,并根据实际的业务需求来选择最合适的数据类型。在创建索引时,映射(Mapping)用于定义每个字段的类型和其他属性(如是否分词、是否可索引、是否存储等)。
2、如何查看字段类型
GET /your_index_name/_mapping
{"your_index_name": {"mappings": {"properties": {"title": {"type": "text"},"description": {"type": "text"},"price": {"type": "float"},"created_at": {"type": "date"},"is_active": {"type": "boolean"}}}}
}
以下是 Elasticsearch 中常见的字段类型及其用途。
一、文本类型 (Text)
用于存储和分析全文本数据,适用于字符串、长文本等需要分词的字段。
1、text
用于存储大量的、需要分词的文本数据。Elasticsearch 会对 text
字段的内容进行分析和分词,这样可以支持全文搜索。Elasticsearch 默认会对 text
类型字段使用一个标准分析器(standard analyzer
),将其分词成多个单词,以便进行高效的全文搜索。
注意:如果字段的类型是 text
,ES 会自动为其创建一个名为 <字段名>.keyword
的子字段,用于精确匹配查询。
适用场景:文章内容、描述、评论等。示例:"description": { "type": "text" }
2、keyword
用于存储不需要分词的字符串数据,通常用于存储标识符、标签、状态、类别等数据。这些字段会被精确匹配,适合用在排序、聚合和过滤中。
适用场景:ID、电子邮件、用户名、状态码等。示例:"status": { "type": "keyword" }
二、数值类型
数值类型用于存储各种数字,包括整数、浮动小数等。
-
long
:用于存储长整型数字,范围从 -2^63 到 2^63-1。- 示例:
"age": { "type": "long" }
- 示例:
-
integer
:用于存储整数,范围从 -2^31 到 2^31-1。- 示例:
"year": { "type": "integer" }
- 示例:
-
short
:用于存储较小的整数,范围从 -2^15 到 2^15-1。- 示例:
"count": { "type": "short" }
- 示例:
-
byte
:用于存储很小的整数,范围从 -128 到 127。- 示例:
"byte_value": { "type": "byte" }
- 示例:
-
double
:用于存储浮动小数,精度较高,范围从 -1.7e308 到 1.7e308。- 示例:
"price": { "type": "double" }
- 示例:
-
float
:用于存储浮动小数,精度较低,范围从 -3.4e38 到 3.4e38。- 示例:
"rating": { "type": "float" }
- 示例:
-
half_float
:用于存储精度较低的浮动小数,范围从 -6.5e4 到 6.5e4。- 示例:
"temperature": { "type": "half_float" }
- 示例:
-
scaled_float
:用于存储带小数的浮动数字,通过一个因子来缩放存储的数据。- 示例:
"price": { "type": "scaled_float", "scaling_factor": 100 }
- 示例:
-
double_range
、float_range
、long_range
、integer_range
:用于存储数值范围类型的数据,通常用于做范围查询。- 示例:
"temperature_range": { "type": "double_range" }
- 示例:
三、日期类型
date
日期类型用于存储时间戳或日期。默认的日期格式是 yyyy-MM-dd'T'HH:mm:ss.SSSZ
,但可以根据需要进行配置。
示例:"timestamp": { "type": "date" }
四、布尔类型
boolean
用于存储 true
或 false
的值。
示例:"is_active": { "type": "boolean" }
五、
二进制类型 (Binary)
用于存储二进制数据(例如图片、音频、视频等)。
示例:"file_data": { "type": "binary" }
六、
IP 类型 (IP)
用于存储 IPv4 和 IPv6 地址。
示例:"ip_address": { "type": "ip" }
七、
地理位置类型 (Geo)
用于存储地理位置信息。
1、geo_point
用于存储地理坐标(经度、纬度),支持地理位置查询。
示例:"location": { "type": "geo_point" }
2、
geo_shape
用于存储复杂的地理形状(如多边形、圆形等),支持对地理区域的查询。
示例:"shape": { "type": "geo_shape" }
八、
对象和嵌套类型
1、object
用于存储 JSON 对象。该类型表示字段中包含嵌套的键值对,可以嵌套多层结构。
示例:"address": { "type": "object" }
2、
nested
与 object
类型类似,但它用于存储嵌套对象,并允许对嵌套对象内的字段进行查询和聚合。它会在查询时将嵌套的文档视为独立的文档。
"comments": {"type": "nested"
}
九、范围类型(Range Types)
- integer_range: 存储整数范围。
- float_range: 存储浮动小数范围。
- date_range: 存储日期范围。
- long_range: 存储长整数范围。
十、合并数据类型(Join)
用于实现父子关系数据建模,常用于表示父文档和子文档之间的关系。
"relationship": {"type": "join"
}
十一、文本多字段(Multi-fields)
在同一字段上定义多个字段类型,便于对数据进行不同方式的处理。例如,可以同时将字段作为 text
类型和 keyword
类型进行存储,以支持全文搜索和精确匹配。
"title": {"type": "text","fields": {"raw": {"type": "keyword"}}
}
十二、标识符类型(Completion)
用于实现高效的建议功能,通常用于自动补全(如搜索框自动提示)。
"suggest": {"type": "completion"
}