记录与字段 #

记录基础 #

什么是记录? #

记录(Record)是Algolia索引中的基本数据单元,以JSON格式存储。每条记录代表一个可搜索的实体。

json
{
  "objectID": "product-001",
  "name": "iPhone 15 Pro",
  "brand": "Apple",
  "price": 999,
  "inStock": true,
  "tags": ["phone", "5g", "apple"]
}

记录结构 #

text
Record
├── objectID (必需)
├── 搜索属性 (searchableAttributes)
├── 分面属性 (attributesForFaceting)
├── 排名属性 (customRanking)
├── 展示属性 (用于前端显示)
└── 内部属性 (不参与搜索)

字段类型 #

基本类型 #

类型 示例 说明
字符串 "iPhone" 文本数据
数字 999 整数或浮点数
布尔 true true/false
数组 ["tag1", "tag2"] 值列表
对象 {"key": "value"} 嵌套结构
null null 空值

字符串字段 #

json
{
  "name": "iPhone 15 Pro",
  "description": "Latest iPhone with A17 Pro chip",
  "sku": "IPHONE-15-PRO-256"
}

数字字段 #

json
{
  "price": 999.99,
  "stock": 50,
  "rating": 4.8,
  "discount": 10
}

注意:数字字段可用于数值比较和排序:

javascript
// 搜索时过滤
filters: 'price < 1000 AND stock > 0'

布尔字段 #

json
{
  "inStock": true,
  "featured": false,
  "published": true
}

搜索时使用:

javascript
filters: 'inStock:true AND featured:true'

数组字段 #

json
{
  "tags": ["phone", "5g", "apple"],
  "colors": ["black", "white", "blue"],
  "sizes": [64, 128, 256]
}

搜索时匹配数组中任意元素:

javascript
// 匹配包含"phone"的记录
filters: 'tags:phone'

// 匹配多个标签
filters: 'tags:phone OR tags:5g'

嵌套对象 #

嵌套结构 #

json
{
  "objectID": "product-001",
  "name": "iPhone 15 Pro",
  "specs": {
    "display": "6.1 inch",
    "chip": "A17 Pro",
    "camera": {
      "main": "48MP",
      "front": "12MP"
    }
  },
  "dimensions": {
    "width": 70.6,
    "height": 146.6,
    "depth": 8.25
  }
}

访问嵌套属性 #

使用点号访问嵌套属性:

javascript
// 设置可搜索属性
searchableAttributes: [
  'name',
  'specs.display',
  'specs.chip',
  'specs.camera.main'
]

// 过滤嵌套属性
filters: 'specs.dimensions.width < 75'

嵌套数组 #

json
{
  "objectID": "product-001",
  "name": "iPhone 15 Pro",
  "variants": [
    { "color": "black", "price": 999, "stock": 50 },
    { "color": "white", "price": 999, "stock": 30 },
    { "color": "blue", "price": 1099, "stock": 20 }
  ]
}

字段设计原则 #

1. 扁平化优先 #

json
// ❌ 不推荐:深层嵌套
{
  "product": {
    "info": {
      "details": {
        "name": "iPhone"
      }
    }
  }
}

// ✅ 推荐:扁平结构
{
  "name": "iPhone",
  "productName": "iPhone 15 Pro"
}

2. 预计算值 #

json
// ❌ 不推荐:搜索时计算
{
  "price": 100,
  "discount": 10
}

// ✅ 推荐:预计算
{
  "price": 100,
  "discount": 10,
  "finalPrice": 90
}

3. 合理的属性数量 #

text
推荐结构:
├── 核心属性 (5-10个) - 参与搜索和排名
├── 展示属性 (10-20个) - 用于前端展示
└── 辅助属性 (5-10个) - 用于过滤和排序

总属性数建议不超过50个

字段用途分类 #

可搜索属性 #

参与全文搜索的字段:

javascript
searchableAttributes: [
  'name',           // 商品名称
  'description',    // 描述
  'brand',          // 品牌
  'category'        // 分类
]

分面属性 #

用于筛选和分类统计:

javascript
attributesForFaceting: [
  'brand',          // 品牌筛选
  'category',       // 分类筛选
  'price',          // 价格区间
  'inStock'         // 库存状态
]

排名属性 #

用于自定义排序:

javascript
customRanking: [
  'desc(rating)',     // 评分高的排前面
  'desc(popularity)', // 人气高的排前面
  'asc(price)'        // 价格低的排前面
]

展示属性 #

仅用于前端显示:

json
{
  "name": "iPhone 15 Pro",
  "imageUrl": "https://example.com/iphone.jpg",
  "productUrl": "/products/iphone-15-pro",
  "description": "..."
}

隐藏属性 #

不返回给前端:

javascript
unretrievableAttributes: [
  'internalId',
  'costPrice',
  'supplierInfo'
]

数据建模示例 #

电商商品 #

json
{
  "objectID": "prod-001",
  
  "name": "iPhone 15 Pro 256GB",
  "description": "Apple iPhone 15 Pro with A17 Pro chip...",
  "brand": "Apple",
  "category": "Smartphones",
  "subcategory": "Flagship Phones",
  
  "price": 999,
  "originalPrice": 1099,
  "discount": 100,
  "currency": "USD",
  
  "rating": 4.8,
  "reviewCount": 1250,
  "popularity": 8500,
  "salesCount": 15000,
  
  "inStock": true,
  "stock": 50,
  
  "tags": ["phone", "5g", "apple", "flagship"],
  "colors": ["black", "white", "blue"],
  "storage": [128, 256, 512],
  
  "imageUrl": "https://example.com/iphone.jpg",
  "thumbnailUrl": "https://example.com/iphone-thumb.jpg",
  "productUrl": "/products/iphone-15-pro",
  
  "specs": {
    "display": "6.1 inch Super Retina XDR",
    "chip": "A17 Pro",
    "ram": "8GB",
    "battery": "3274 mAh"
  },
  
  "createdAt": 1709500800,
  "updatedAt": 1710432000
}

博客文章 #

json
{
  "objectID": "post-001",
  
  "title": "Getting Started with Algolia",
  "content": "In this tutorial, we will learn...",
  "excerpt": "Learn the basics of Algolia search...",
  
  "author": {
    "name": "John Doe",
    "id": "user-123",
    "avatar": "https://example.com/avatar.jpg"
  },
  
  "category": "Technology",
  "tags": ["algolia", "search", "tutorial"],
  
  "status": "published",
  "featured": true,
  
  "viewCount": 5420,
  "likeCount": 320,
  "commentCount": 45,
  
  "publishedAt": 1710432000,
  "updatedAt": 1710518400,
  
  "url": "/blog/getting-started-with-algolia",
  "imageUrl": "https://example.com/post-image.jpg"
}

用户档案 #

json
{
  "objectID": "user-001",
  
  "name": "John Doe",
  "email": "john@example.com",
  "username": "johndoe",
  
  "bio": "Software developer interested in...",
  "location": "San Francisco, CA",
  
  "skills": ["JavaScript", "Python", "React"],
  "interests": ["AI", "Web Development", "Open Source"],
  
  "followers": 1250,
  "following": 320,
  "posts": 45,
  
  "joinedAt": 1709500800,
  "lastActiveAt": 1710432000,
  
  "avatarUrl": "https://example.com/avatar.jpg",
  "profileUrl": "/users/johndoe"
}

字段命名规范 #

推荐命名 #

json
{
  "objectID": "prod-001",        // 使用前缀区分类型
  "name": "...",                  // 小驼峰命名
  "imageUrl": "...",              // URL后缀
  "createdAt": 1234567890,        // 时间戳后缀
  "inStock": true,                // 布尔前缀
  "reviewCount": 100,             // 数量后缀
  "isFeatured": true              // 布尔前缀
}

避免的命名 #

json
{
  "_id": "...",           // 避免下划线开头
  "name-en": "...",       // 避免连字符
  "NAME": "...",          // 避免全大写
  "name1": "...",         // 避免数字后缀
  "data": {...}           // 避免泛化名称
}

字段限制 #

限制项
记录大小 10KB(免费)/ 20KB(付费)
属性数量 最多1000个
属性名长度 最多100字符
数组元素 最多1000个
嵌套深度 建议≤3层

数据更新策略 #

全量更新 #

javascript
// 替换整个记录
await index.saveObject({
  objectID: '1',
  name: 'Updated Name',
  price: 899
});

部分更新 #

javascript
// 只更新指定字段
await index.partialUpdateObject({
  objectID: '1',
  price: 899,
  stock: 45
});

原子操作 #

javascript
// 增量更新(原子操作)
await index.partialUpdateObject({
  objectID: '1',
  viewCount: { _operation: 'Increment', value: 1 }
});

支持的原子操作:

操作 说明
Increment 增加数值
Decrement 减少数值
Add 添加数组元素
Remove 移除数组元素
AddUnique 添加唯一元素

总结 #

记录与字段设计要点:

要点 说明
结构 JSON格式,objectID必需
类型 字符串、数字、布尔、数组、对象
设计 扁平化、预计算、合理数量
分类 搜索、分面、排名、展示、隐藏
命名 小驼峰、语义化、一致性

接下来,让我们学习 搜索参数

最后更新:2026-03-28