Elasticsearch 支持多种数据类型以适应不同场景的需求。以下是一些常见的数据类型及其应用场景:
-
Text
- 用途: 用于全文本搜索和分析。
- 特点: 文本类型的数据会经过分析器(Analyzer)处理,将其分解成词语(tokens),然后索引这些词语以便进行全文搜索。
text
类型字段适合用于博客文章、产品描述等长文本内容的搜索。
"description": { "type": "text", "analyzer": "standard" // 或者使用其他自定义分析器 }
-
Keyword
- 用途: 用于精确值匹配、排序、聚合等操作。
- 特点: 关键词类型的数据不会被分析,而是作为一个整体进行索引。这对于身份证号、电子邮件地址、标签、类别名等需要完整匹配的场景非常有用。
"product_id": { "type": "keyword" }
-
Date
- 用途: 存储和搜索日期/时间值。
- 特点: Elasticsearch 提供了丰富的日期格式支持,并且日期字段可以进行范围查询、排序和聚合。
"created_at": { "type": "date", "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ" // 或其他日期格式 }
-
Object
- 用途: 存储嵌套的对象结构,比如用户地址信息、关联的评论列表等。
- 特点: 对象可以包含多个子字段,这些字段可以是任何其他类型,包括其他的对象类型。
"address": { "type": "object", "properties": { "street": { "type": "text" }, "city": { "type": "text" }, "country": { "type": "keyword" } } }
-
Nested
- 用途: 用于存储可独立检索和聚合的嵌套对象数组。
- 特点: 与对象类型相似,但提供更高级的功能,使得数组中的每个对象都能单独索引和查询。
"orders": { "type": "nested", "properties": { "order_id": { "type": "keyword" }, "items": { "type": "object", "properties": { "item_name": { "type": "text" }, "quantity": { "type": "integer" } } } } }
-
Geo Point
- 用途: 存储地理坐标点,可用于地理位置相关的搜索、过滤和聚合。
- 特点: 可以表示经纬度坐标,支持距离搜索、边界框搜索等。
"location": { "type": "geo_point" }
-
Geo Shape
- 用途: 存储地理形状,如多边形、线段等,用于复杂的地理空间查询。
- 特点: 支持多种几何形状,可以用来做更复杂的地理区域匹配。
-
数值类型(Numeric Types):
long
,integer
,short
,byte
,double
,float
,half_float
,scaled_float
等,用于存储数值数据,适用于排序、范围查询和统计聚合。
实战中,选择正确的数据类型至关重要,因为这不仅影响数据的索引效率、存储大小,也直接影响到能否正确执行查询和聚合操作。在创建索引时,应该根据具体业务需求和数据特点来制定恰当的映射(mapping)。