2. 核心概念:实体(Entity)、关系(Relationship)、属性(Attribute)的定义与示例

在领域建模驱动搜索索引的设计中,实体(Entity)、关系(Relationship)和属性(Attribute)是构成领域模型的三个基本要素。它们共同定义了业务数据的结构、语义和关联方式,是后续文档嵌套与索引映射的基础。

2.1 实体(Entity)

实体是领域中可被唯一标识的、具有独立业务含义的对象或事物。在搜索索引语境下,实体通常对应一个核心的搜索结果条目或一个独立的索引文档。

  • 唯一标识:每个实体都有一个全局唯一的标识符(如 ID、UUID)。
  • 业务边界:实体封装了一组内聚的属性,代表一个完整的业务概念。
  • 生命周期:实体在业务过程中可被创建、修改、删除或归档。
常见实体示例: 商品(Product)、用户(User)、订单(Order)、文章(Article)、店铺(Store)。

2.2 关系(Relationship)

关系描述了两个或多个实体之间的业务连接或语义关联。关系决定了实体在搜索索引中如何被关联、嵌套或引用。

关系类型 说明 搜索索引映射示例
一对一 (1:1) 一个实体实例唯一关联另一个实体实例 用户 ↔ 身份证信息(可内联为嵌套对象)
一对多 (1:N) 一个实体实例关联多个其他实体实例 分类 → 商品列表(可内联为嵌套数组)
多对多 (M:N) 多个实体实例相互关联 商品 ↔ 标签(通常拆解为反向链接或嵌套ID数组)
设计要点: 在搜索索引中,关系通常通过文档嵌套或字段引用来实现。高频查询的关联数据优先考虑嵌套,低频或易变的数据优先考虑引用。

2.3 属性(Attribute)

属性是实体或关系所具有的特征、状态或度量。属性是搜索索引中字段(Field)的直接来源,决定了索引的可搜索性、可过滤性和可排序性。

  • 标识属性:唯一标识实体的属性(如 productId)。
  • 描述属性:用于展示和搜索的属性(如 title、description)。
  • 分类属性:用于过滤和聚合的属性(如 category、brand)。
  • 度量属性:用于排序和计算的数值属性(如 price、rating)。
  • 时间属性:用于时间范围查询的属性(如 createdAt、updatedAt)。

2.4 三者关系与示例

下面通过一个电商搜索场景的SVG图,直观展示实体、关系与属性的协作方式。

电商领域:实体、关系与属性示例 电商搜索领域:实体、关系与属性示例 商品 (Product) • productId (标识) • title (描述) • price (度量) • categoryId (引用) 分类 (Category) • categoryId (标识) • name (描述) • parentId (层级) • level (度量) 关系:属于 (N:1) 用户 (User) • userId (标识) • userName (描述) • level (度量) 评论 (Review) • reviewId (标识) • content (描述) • rating (度量) 关系:撰写 (1:N) 关系:评论对象 (N:1)

2.5 属性在索引中的映射规则

属性映射到搜索索引字段时,需要根据业务查询模式选择合适的字段类型和索引策略。

属性类别 推荐字段类型 索引策略 示例
标识属性 keyword 精确匹配,不分词 productId: "P10086"
描述属性 text 全文分词,支持模糊搜索 title: "无线蓝牙耳机"
分类属性 keyword 精确过滤,支持聚合 brand: "华为"
度量属性 float / integer 范围查询,排序 price: 299.00
时间属性 date 时间范围过滤,排序 createdAt: "2025-01-15"
常见误区: 将描述属性(如商品标题)错误映射为 keyword 类型,会导致无法进行分词搜索,用户输入“蓝牙耳机”时无法匹配“无线蓝牙耳机”。反之,将标识属性映射为 text 类型,会导致精确查询性能下降且可能产生错误匹配。

2.6 实体、关系与属性的协同设计原则

  1. 实体优先:先识别业务中的核心实体,再定义其属性和关系。
  2. 关系驱动嵌套:高频一起查询的实体关系,优先考虑文档嵌套;低频或独立查询的关系,使用引用。
  3. 属性按需索引:只为搜索、过滤、排序所需的属性建立索引,避免索引冗余字段。
  4. 命名一致性:实体名、关系名、属性名在整个模型中保持统一的命名规范(如 camelCase 或 snake_case)。
实践建议: 在开始索引设计前,先用领域建模工具(如 ER 图、UML 类图)绘制实体关系图,明确每个实体的关键属性和关系基数。这一步能大幅减少后续索引重构的成本。