Elasticsearch 实战:Elasticsearch 文档映射关系
在 Elasticsearch 中,文档映射(Mapping)定义了索引中每个字段的类型、属性以及如何处理这些字段。正确的映射设计对数据的索引、搜索、分析至关重要。以下是如何进行文档映射关系管理的详细步骤:
**1. **自动映射(Dynamic Mapping)
Elasticsearch 具有自动映射功能,当索引中首次出现未知字段时,Elasticsearch 会根据字段值自动推断其类型,并创建相应的映射。虽然自动映射简化了索引初期的管理工作,但在实际应用中,通常建议显式定义映射以确保数据处理的一致性和准确性。
**2. **显式定义映射
创建索引时,可以显式定义映射。例如,定义一个包含 title
(文本类型)、author
(关键词类型)、price
(浮点数类型)、publication_date
(日期类型)的映射:
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"author": {
"type": "keyword"
},
"price": {
"type": "float"
},
"publication_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
**3. **字段类型
Elasticsearch 支持多种字段类型,如:
- 文本类型(Text):用于全文搜索的文本字段,会被分词器处理。
- 关键词类型(Keyword):用于精确匹配的文本字段,不会被分词器处理。
- 数值类型:如
long
、integer
、short
、byte
(整数)、double
、float
、half_float
、scaled_float
(浮点数)。 - 日期类型(Date):存储日期或时间戳。
- 布尔类型(Boolean):存储
true
或false
值。 - 地理类型:如
geo_point
、geo_shape
,用于存储地理位置信息。 - 数组类型:一个字段可以存储多个值,如
["apple", "banana", "orange"]
。 - 对象类型:一个字段可以包含多个子字段,形成嵌套结构。
**4. **字段属性
除了字段类型外,还可以为字段指定各种属性,如:
- 分词器(Analyzer):指定用于处理文本字段的分词器,影响全文搜索的效果。
- 忽略空值(Ignore Malformed):设置为
true
时,遇到不符合字段类型的值时,Elasticsearch 将忽略该值而非抛出异常。 - 多字段(Multi Fields):为同一字段创建多个视图(如一个用于全文搜索,另一个用于排序或聚合)。
- 副本数(Fields):为字段指定副本数量,影响数据冗余和可用性。
- 存储(Stored):决定字段值是否存储在倒排索引之外,便于后续获取原始值。
- 索引(Indexed):决定字段是否参与搜索和排序。
- doc_values:决定字段是否使用 doc_values 存储,影响聚合性能。
**5. **更新映射
在索引创建后,通常不允许直接修改已有的字段映射。对于新增字段或需要修改映射的场景,可以采取以下策略:
- 使用动态映射更新:关闭自动映射,手动更新映射,然后重新索引数据。
- 创建新索引:定义新的映射,将数据迁移到新索引,然后弃用旧索引。
**6. **映射模板(Mapping Template)
映射模板(Index Template)可以定义一套默认的映射规则,当创建符合模板匹配条件的新索引时,自动应用这些映射。这样可以简化映射管理,确保新索引的一致性。例如,创建一个适用于所有以 book_*
开头的索引的模板:
PUT _index_template/book_template
{
"index_patterns": ["book_*"],
"template": {
"mappings": {
"properties": {
"title": {
"type": "text"
},
"author": {
"type": "keyword"
},
"price": {
"type": "float"
},
"publication_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
}
通过精心设计和管理文档映射,您可以确保 Elasticsearch 正确处理和索引数据,优化搜索和分析性能,同时简化索引的管理和维护工作。结合业务需求和数据特点,合理选择字段类型、属性以及映射管理策略,构建满足需求的索引结构。同时,关注映射对查询性能和磁盘空间的影响,适时进行映射优化。