MST
星途 面试题库

面试题:ElasticSearch复杂数据结构下映射数据类型的优化选择

假设你有一个包含多层嵌套结构的文档,如电商产品文档,其中既有产品基本信息(字符串、数字等),又有产品评论(文本),评论还包含点赞数(数值)、评论人信息(对象嵌套)等。请详细阐述你会如何设计ElasticSearch的映射数据类型,以确保高效的存储和搜索,同时要考虑到不同数据类型在聚合分析等场景下的表现。
15.3万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

1. 产品基本信息

  • 字符串类型:对于产品名称、品牌等字符串字段,若需要进行全文搜索,可设置为 text 类型,并指定合适的分词器,如 ik_max_word(针对中文)。例如:
{
  "product_name": {
    "type": "text",
    "analyzer": "ik_max_word"
  }
}

若仅用于精确匹配(如产品编号),则设置为 keyword 类型:

{
  "product_id": {
    "type": "keyword"
  }
}
  • 数字类型:根据数值范围选择合适的数字类型,如 integer(适用于一般整数)、long(大整数)、float(小数)等。例如产品价格可设置为 float
{
  "price": {
    "type": "float"
  }
}

2. 产品评论

  • 文本类型:评论内容通常是长文本,设置为 text 类型,并选择合适的分词器进行全文搜索,方便用户搜索特定评论内容:
{
  "review_content": {
    "type": "text",
    "analyzer": "ik_max_word"
  }
}
  • 点赞数:点赞数为数值,可设置为 integer 类型,便于进行聚合分析,如统计点赞数最多的产品评论:
{
  "like_count": {
    "type": "integer"
  }
}

3. 评论人信息

  • 对象嵌套类型:评论人信息可能包含姓名、年龄、地址等多个字段,将其定义为 object 类型。如果评论人信息需要独立进行搜索和聚合分析(例如按评论人所在地区统计评论数量),则使用 nested 类型。以 nested 类型为例:
{
  "reviewer": {
    "type": "nested",
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "age": {
        "type": "integer"
      },
      "address": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

4. 聚合分析考虑

  • 字符串字段text 类型字段不适合直接用于聚合,因为分词后会丢失原词的完整性。而 keyword 类型适合用于聚合分析,如按品牌统计产品数量。
  • 数字字段:数字类型字段非常适合聚合分析,如计算产品价格的平均值、评论点赞数的总和等。
  • 嵌套对象:对于 nested 类型对象,在进行聚合分析时,需要使用 nested 聚合语法,以确保每个嵌套文档被独立处理,避免数据错误。例如,统计不同地区评论人的评论数量:
{
  "aggs": {
    "reviewers_by_address": {
      "nested": {
        "path": "reviewer"
      },
      "aggs": {
        "address_buckets": {
          "terms": {
            "field": "reviewer.address.keyword"
          }
        }
      }
    }
  }
}

通过这样设计 ElasticSearch 的映射数据类型,可以在高效存储的同时,满足各种搜索和聚合分析的需求。