MST
星途 面试题库

面试题:ElasticSearch索引映射机制之复杂类型处理

在ElasticSearch索引映射中,对于嵌套类型(nested type)和对象类型(object type)有不同的处理方式。假设你有一个包含多层嵌套结构的文档,例如文档记录了一个公司的部门信息,部门下有员工,员工又有多个技能,每个技能有对应的等级。请说明如何使用索引映射来合理存储和检索这类数据,以及在查询时要注意什么。
24.5万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

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 类型等提高查询效率。