# 个性化搜索结果

在构建搜索体验的语境下,个性化指的是根据我们掌握的搜索者独特特征,为其呈现不同排序结果的流程。

个性化机制分为两种类型:

  1. 用户组级别个性化 - 根据每个用户组的聚合特征(订阅计划、用户角色、高LTV客户等)和/或该组用户共有的历史行为,为每个用户组提供独特的搜索结果排序。
  2. 用户级别个性化 - 根据特定用户的具体历史行为(过往搜索记录、购买记录、点击记录等),为每个用户提供独特的搜索结果排序。

# 用户组级别的个性化推荐

首先,我们来看看如何使用 Typesense 的基于流行度的排序功能实现用户组级别的个性化推荐

相比需要机器学习的用户级别个性化,这是一种更简单、更易实现的方案。

我们以硬件工具电商网站为例,用户可以选择三种付费订阅计划:

  1. 业余爱好者计划
  2. 进阶计划
  3. 专业计划

假设我们希望根据用户所属计划,在搜索常见术语时展示不同的产品。例如:

  • 当业余爱好者计划的用户搜索"screwdriver"时,显示适合业余使用的小型螺丝刀套装
  • 当专业计划的用户搜索同样的"screwdriver"时,则显示适合专业人士的重型电动螺丝刀套装

以下是使用 Typesense 实现的方法。

假设我们有如下两条产品记录:

[
  {
    "name": "3-piece Screwdriver Set",
    "price": 10.0,
    "category": "Tools"
  },
  {
    "name": "120-piece Power Screwdriver Set",
    "price": 250.0,
    "category": "Tools"
  }
]

我们可以基于启发式方法或已知的用户组信息,为每条记录添加计划特定的流行度分数:






 
 
 





 
 
 



[
  {
    "name": "3-piece Screwdriver Set",
    "price": 10.0,
    "category": "Tools",
    "hobbyist_plan_popularity_score": 100,
    "advanced_plan_popularity_score": 50,
    "professional_plan_popularity_score": 10
  },
  {
    "name": "120-piece Power Screwdriver Set",
    "price": 250.0,
    "category": "Tools",
    "hobbyist_plan_popularity_score": 10,
    "advanced_plan_popularity_score": 50,
    "professional_plan_popularity_score": 100    
  }
]

这些流行度分数可以通过业务逻辑或机器学习模型计算得出。

当业余爱好者计划的用户登录时,为了展示针对该用户组的个性化结果,我们在搜索查询中添加以下 sort_by 参数:

sort_by=_text_match(buckets: 10):desc,hobbyist_plan_popularity_score:desc

这将使 Typesense 将文本相关性与流行度分数交织排序,优先显示"3-piece Screwdriver Set"。

同理,当专业计划的用户登录时,我们添加以下参数:

sort_by=_text_match(buckets: 10):desc,professional_plan_popularity_score:desc

这会优先显示"120-piece Power Screwdriver Set"。

# 使用场景

您可以利用这一概念,根据不同用户的特征展示个性化搜索结果,例如基于:

  • 客户生命周期价值分组(高、中、低消费群体)
  • 账户使用年限(超过5年的老账户、2年账户和新账户)
  • 年龄段(如果您已收集此类信息)
  • 性别(例如,当用户表明自己是女性时,可以提升女性相关商品的排名)
  • 地理位置(例如,针对美国与欧洲的客户可以采用不同的商品排序策略)

# 用户级个性化

Typesense 的 向量查询重排序功能 允许您将来自机器学习模型的 嵌入向量(以用户过去行为作为输入)索引到 Typesense 中,然后用于根据每个用户的历史行为对结果进行个性化重排序。

例如,您可以按照 推荐系统指南 中描述的相同步骤构建模型,然后在 最后一步 中,在为新用户的会话行为生成嵌入向量后,不是将嵌入向量发送到 vector_query 参数(用于生成推荐),而是像下面这样发送到 sort_by 参数(以个性化方式重排序结果):











 




curl "${TYPESENSE_URL}/multi_search" \
        -X POST \
        -H "Content-Type: application/json" \
        -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
        -d '{
          "searches": [
            {
              "collection": "products",
              "q": "shoes",
              "query_by": "title,brand,category",
              "sort_by": "_text_match:desc,_vector_query(embedding:(['${embedding%?}'])):asc"
            }
          ]
        }' | jq '.results[0].hits[]'

Typesense 会首先对 shoes 进行关键词搜索,然后使用机器学习模型为该特定用户会话行为生成的嵌入向量对结果进行重排序,使得最接近该用户偏好的记录排名更高。

此功能自 Typesense v0.25.2 版本起可用。