合理设置映射属性
- 嵌套类型使用:对于多层嵌套结构,使用
nested
类型来确保嵌套文档内的对象被独立索引和搜索。例如,如果文档中有一个地址数组,每个地址又是包含街道、城市等子字段的对象,可如下设置:
{
"mappings": {
"properties": {
"addresses": {
"type": "nested",
"properties": {
"street": { "type": "text" },
"city": { "type": "text" }
}
}
}
}
}
- 动态映射控制:使用
dynamic
参数控制动态映射行为。如果文档结构相对固定,可设置dynamic: false
,避免意外的字段被自动映射,减少不必要的索引开销。若需要允许部分新字段动态映射,可使用dynamic: strict
,在遇到不期望的字段时抛出异常。
- 字段级映射:根据字段用途准确设置数据类型。例如,对于日期字段使用
date
类型,数字字段根据范围使用合适的数值类型(如integer
、long
、float
、double
)。对于无需精确搜索的文本字段,可使用text
类型并指定合适的分词器;对于需要精确匹配的字段(如ID、状态码),使用keyword
类型。
性能因素考虑
- 索引策略:
- 分析器选择:对于文本字段,选择合适的分析器。例如,对于英文文本,
standard
分析器是常用的,但对于特定语言或领域,可能需要自定义分析器。避免使用过于复杂的分析器,以免增加索引和搜索时的计算开销。
- 倒排索引大小:减少不必要的字段索引。如果某些字段仅用于显示,不需要搜索,可设置
index: false
。同时,对于低频词,可通过设置min_term_freq
参数控制其是否被索引,以减小倒排索引大小。
- 字段数据类型优化:
- 数值类型选择:根据数值范围选择最小的数据类型。例如,若数值范围在 -32,768 到 32,767 之间,使用
short
类型而非integer
类型,以减少存储空间。
- 文本类型优化:对于长文本字段,如果不需要对全文进行搜索,可使用
keyword
类型存储摘要信息,以提高查询效率。同时,通过设置fields
参数,对同一字段使用不同的映射,如一个text
类型用于全文搜索,一个keyword
类型用于精确匹配。
- 避免热字段问题:
- 字段拆分:如果一个字段在大量查询中频繁使用(热字段),可考虑将其拆分为多个字段。例如,一个包含姓名和职位的
full_name
字段,如果经常按姓名和职位分别查询,可拆分为name
和position
两个字段。
- 缓存策略:对于热字段的查询结果,可使用外部缓存(如Redis)进行缓存,减少对ElasticSearch的直接查询压力。同时,在ElasticSearch内部,合理设置查询缓存参数,如
index.query_cache.type
等,提高热字段查询的缓存命中率。