es中的数据类型
字符串
文本(Text)
- 作用:适用于全文搜索的文本字段,例如文章内容、电子邮件正文、产品描述等长文本。
- 特点:ES会对文本内容进行分词处理,将字符串转换为单个术语的列表,支持全文搜索和模糊查询。但通常不用于排序或聚合。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"description": {
"type": "text",
"analyzer": "standard"
}
}
}
}
我有一辆汽车
我有
一辆汽车
汽车
车
我
关键字(Keyword)
- 作用:适用于精确匹配的字段,例如名称、标签、用户ID、电子邮件地址、状态码等短文本。
- 特点:不会对字段内容进行分词处理,直接构建倒排索引,适合精确查询、过滤、排序和聚合操作。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"email": {
"type": "keyword"
}
}
}
}
Text和Keyword类型比较
- 存储方式:Text类型字段会被分析器处理,分解成词元并存储在倒排索引中;Keyword类型字段则保持原样存储。
- 搜索方式:Text类型支持全文搜索,包括模糊查询和前缀查询;Keyword类型支持精确匹配和聚合。
- 使用场景:Text类型适用于搜索和分析非结构化文本;Keyword类型适用于存储需要精确检索的结构化数据。
- 性能考虑:Text类型由于需要经过分析器处理,可能会占用更多的资源;Keyword类型查询性能更高,但不支持全文搜索。
整数(Integer)
- 作用:适用于存储32位有符号整数,如年龄、评分等。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"age": {
"type": "integer"
}
}
}
}
长整数(Long)
- 作用:适用于存储64位有符号整数,如大型计数器、用户ID等。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"user_id": {
"type": "long"
}
}
}
}
浮点数(Float)
- 作用:适用于存储32位单精度浮点数,如价格、温度等。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"price": {
"type": "float"
}
}
}
}
双精度浮点数(Double)
- 作用:适用于存储64位双精度浮点数,如科学计算结果。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"result": {
"type": "double"
}
}
}
}
日期(Date)
- 作用:适用于存储日期和时间,如日志时间戳、事件日期等。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
布尔(Boolean)
- 作用:适用于存储布尔值true、false,如开关状态、是否可用等。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"is_active": {
"type": "boolean"
}
}
}
}
二进制(Binary)
- 作用:用于存储Base64编码的二进制数据,如文件、图片等。
- 注意事项:二进制字段不适用于搜索,主要用于存储原始数据。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"file": {
"type": "binary"
}
}
}
}
范围类型(Range Types)
- 作用:用于存储数值范围,如年龄范围、价格区间等。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"age_range": {
"type": "integer_range"
}
}
}
}
对象(Object)
- 作用:用于存储结构化或半结构化数据,如用户信息、配置项等。
- 注意事项:对象类型字段在Elasticsearch 6.x及以后版本中已被弃用,建议使用嵌套对象(Nested Object)或多字段(Multi-Field)。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"user": {
"type": "object",
"enabled": false
}
}
}
}
嵌套对象(Nested Object)
- 作用:用于存储嵌套结构的数据,例如包含数组对象的场景(订单中的多个商品项)。
- 注意事项:嵌套对象查询性能较低,应谨慎使用。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"orders": {
"type": "nested",
"properties": {
"product_name": { "type": "text" },
"price": { "type": "double" }
}
}
}
}
}
- nested 类型的特点:
- 独立性:数组中的每个对象都是独立的,查询条件不会跨对象匹配。
- 查询方式:必须使用 nested 查询来访问嵌套对象的字段。
- 更新限制:更新嵌套对象时,必须重新索引整个文档。
- 性能考量:嵌套文档会增加索引大小和查询复杂度,应合理使用。
- 适用场景
- 处理对象数组,且需要在同一个对象内进行多条件匹配。
- 如电商产品的评论列表(每条评论有作者、内容、评分等字段)。
- 如文章的标签列表(每个标签有名称、权重等属性)。
- nested和object的区别:当有一个字段包含对象数组时,默认的 object 类型会将这些对象 “扁平化” 处理,可能导致查询结果不符合预期,而 nested 类型则会保留数组中每个对象的独立性。
假设有这样的文档结构:
{
"group": "fans",
"user": [
{"first": "John", "last": "Smith"},
{"first": "Alice", "last": "White"}
]
}
如果 user 字段使用默认的 object 类型,Elasticsearch 会将其内部结构扁平化处理为:
user.first: ["John", "Alice"]
user.last: ["Smith", "White"]
这种情况下,如果你查询 user.first: John AND user.last: White,会错误地匹配到这个文档(因为扁平化后两个条件会跨对象匹配)。
而使用 nested 类型,每个对象会被视为独立的文档,确保查询条件只会在同一个对象内匹配。
定义 nested 类型映射
PUT my_index
{
"mappings": {
"properties": {
"group": { "type": "keyword" },
"user": {
"type": "nested", // 定义为nested类型
"properties": {
"first": { "type": "text" },
"last": { "type": "text" }
}
}
}
}
}
定义 nested 类型字段
GET my_index/_search
{
"query": {
"nested": {
"path": "user", // 指定nested字段的路径
"query": {
"bool": {
"must": [
{ "match": { "user.first": "John" } },
{ "match": { "user.last": "Smith" } }
]
}
},
"inner_hits": { // 可选,返回匹配的嵌套对象
"highlight": {
"fields": {
"user.first": {}
}
}
}
}
}
}
多字段(Multi-Field)
- 作用:允许一个字段使用不同的类型进行索引,适用于需要同时进行全文搜索和精确匹配的场景。
- 注意事项:多字段可以提高查询的灵活性,但会占用更多的存储空间。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"full_name": {
"type": "text",
"fields": {
"raw": { "type": "keyword" }
}
}
}
}
}
IP地址(IP)
- 作用:用于存储IP地址,如访问日志中的客户端IP。
- 注意事项:IP地址类型支持IP地址的查询和聚合。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"ip_address": {
"type": "ip"
}
}
}
}
完成(Completion)
- 作用:用于自动完成建议,如搜索引擎的自动补全功能。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"suggest": {
"type": "completion"
}
}
}
}
地理位置点(Geo-point)
- 作用:用于存储地理位置点,如用户的地理位置信息。
- 注意事项:地理位置点类型支持基于地理位置的查询和聚合。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
地理位置形状(Geo-shape)
- 作用:用于存储地理空间形状,如国家边界、城市区域等。
- 注意事项:地理形状类型支持复杂的地理空间查询。
- 示例代码:
PUT /my_index
{
"mappings": {
"properties": {
"shape": {
"type": "geo_shape"
}
}
}
}
人生如逆旅
我亦是行人

浙公网安备 33010602011771号