1. 索引映射设计
- 对象类型:对于外层结构,如公司和部门,可以使用对象类型。因为这些结构相对简单,没有内部需要独立查询每个元素的需求。例如:
{
"mappings": {
"properties": {
"company_name": {
"type": "text"
},
"department": {
"type": "object",
"properties": {
"department_name": {
"type": "text"
}
}
}
}
}
}
- 嵌套类型:对于员工和技能这种需要独立查询每个元素的结构,应使用嵌套类型。因为在对象类型中,Elasticsearch 将整个对象结构扁平化存储,无法对嵌套数组中的每个元素进行独立查询。而嵌套类型会将每个嵌套文档作为独立的隐藏文档进行索引,从而支持对嵌套文档中每个元素的独立查询。例如:
{
"mappings": {
"properties": {
"company_name": {
"type": "text"
},
"department": {
"type": "object",
"properties": {
"department_name": {
"type": "text"
},
"employees": {
"type": "nested",
"properties": {
"employee_name": {
"type": "text"
},
"skills": {
"type": "nested",
"properties": {
"skill_name": {
"type": "text"
},
"skill_level": {
"type": "integer"
}
}
}
}
}
}
}
}
}
}
2. 查询注意事项
- 嵌套查询:查询嵌套类型数据时,必须使用
nested
查询语法。例如,要查询拥有 “Java” 技能且等级为 5 的员工:
{
"query": {
"nested": {
"path": "department.employees.skills",
"query": {
"bool": {
"must": [
{
"match": {
"department.employees.skills.skill_name": "Java"
}
},
{
"match": {
"department.employees.skills.skill_level": 5
}
}
]
}
}
}
}
}
- 性能影响:由于嵌套类型将每个嵌套文档作为独立隐藏文档索引,查询时需要更多的资源。因此,在设计时要权衡嵌套的深度和数量,避免过度嵌套导致性能问题。同时,可以考虑对常用查询字段进行适当的索引优化,如使用
keyword
类型等提高查询效率。