概叙

科普文:Elasticsearch系列之【图解Elasticsearch六大顶级核心应用场景】-CSDN博客

科普文:Elasticsearch系列之【Elasticsearch实操:全文搜索与高亮显示】-CSDN博客

科普文:Elasticsearch系列之【Elasticsearch实操:日志收集与分析】-CSDN博客

利用Elasticsearch构建一个基于标签的兴趣推荐系统。我们将使用Elasticsearch作为搜索引擎和存储引擎,通过索引和搜索标签信息来实现推荐功能。

个性化推荐系统

业务场景: 

某在线视频平台希望通过构建个性化推荐系统,根据用户的历史观看记录、兴趣偏好和行为数据,为用户推荐相关视频内容。这类推荐系统有助于提升用户的粘性和转化率,进一步推动平台的商业化。为了实现该目标,可以采用基于 Elasticsearch 的内容推荐模型,结合协同过滤(Collaborative Filtering)、内容过滤(Content-Based Filtering)以及基于行为的数据分析。

解决方案:

  • 用户行为数据建模: 将用户的浏览历史、点赞、评论等行为数据记录到 Elasticsearch 中,并构建倒排索引以便快速查询。

  • 推荐算法: 使用 More Like This 查询,根据用户历史观看的视频,推荐相似的视频。结合 function_score查询,基于用户行为频次加权,个性化推荐排序。

  • 动态调整推荐结果: 使用 Elasticsearch 的聚合分析功能,定期统计受欢迎的视频,并结合流行度(如播放量、点赞数)来调整推荐策略。

详细分析: Elasticsearch 的 More Like This 查询非常适合用于相似内容推荐的场景,能够根据用户的兴趣偏好进行相关视频的推荐。其高效的索引和查询机制,加上支持复杂的查询组合,使得推荐系统既能保持较高的实时性,又能根据动态数据调整推荐结果。

实现步骤

  1. 数据准备与索引设计

  2. 用户行为数据的存储与分析

  3. 基于内容的推荐算法

  4. 基于协同过滤的推荐算法

  5. 综合推荐与实时推荐

  6. 结果展示与优化

1. 数据准备与索引设计

推荐系统的核心是数据,首先我们需要创建 Elasticsearch 索引来存储用户和视频的数据。

视频内容索引

视频索引中包含视频的基础信息,如标题、描述、标签、类别等,这些信息可以用来计算视频的相似度。

PUT /videos
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "description": {
        "type": "text"
      },
      "tags": {
        "type": "keyword"
      },
      "category": {
        "type": "keyword"
      },
      "release_date": {
        "type": "date"
      }
    }
  }
}

用户行为索引

我们还需要存储用户的行为数据,比如他们看过哪些视频,搜索过哪些关键词等。这些数据将用于个性化推荐。

PUT /user_actions
{
  "mappings": {
    "properties": {
      "user_id": {
        "type": "keyword"
      },
      "video_id": {
        "type": "keyword"
      },
      "action_type": {
        "type": "keyword"   # 例如: view, like, search, etc.
      },
      "timestamp": {
        "type": "date"
      }
    }
  }
}

2. 用户行为数据的存储与分析

用户行为数据是个性化推荐的核心依据。我们可以通过 Filebeat 等工具实时采集用户的观看行为数据,并将其存储到 Elasticsearch 中。

例如,用户观看了某个视频,行为数据可能如下:

POST /user_actions/_doc
{
  "user_id": "weige",
  "video_id": "video789",
  "action_type": "view",
  "timestamp": "2024-10-14T12:30:00Z"
}

为了分析用户的兴趣,我们可以使用 Elasticsearch 的聚合功能。比如,统计用户观看最多的类别和标签,以此作为兴趣偏好的基础。

聚合查询:统计某用户观看最多的视频类别

GET /user_actions/_search
{
  "size": 0,
  "query": {
    "term": {
      "user_id": "weige"
    }
  },
  "aggs": {
    "favorite_categories": {
      "terms": {
        "field": "category.keyword",
        "size": 5
      }
    }
  }
}

该查询可以帮助我们了解用户最常观看的前 5 个视频类别。

3. 基于内容的推荐算法

基于内容的推荐算法通过分析用户观看过的视频内容(标题、描述、标签等),为用户推荐相似的视频。我们可以使用 Elasticsearch 的 more_like_this 查询来找到和用户已观看内容相似的视频。

使用 more_like_this 进行基于内容的推荐

假设用户刚刚观看了视频 video789,我们希望找到与该视频内容相似的其他视频。

GET /videos/_search
{
  "query": {
    "more_like_this": {
      "fields": ["title", "description", "tags"],
      "like": [
        {
          "_id": "video789"
        }
      ],
      "min_term_freq": 1,
      "max_query_terms": 12
    }
  }
}

这个查询会根据视频 video789 的标题、描述和标签,推荐相似的视频。min_term_freq 和 max_query_terms可以用来调整推荐的相似度。

4. 基于协同过滤的推荐算法

协同过滤(Collaborative Filtering)是另一种常用的推荐算法,它通过分析不同用户的行为数据,寻找用户之间的相似性,从而推荐其他用户喜欢的视频。

查询与用户行为相似的用户

我们可以通过 Elasticsearch 的聚合来查找与当前用户行为相似的其他用户,比如查找同样观看过某个视频的用户。

GET /user_actions/_search
{
  "size": 0,
  "query": {
    "term": {
      "video_id": "video789"
    }
  },
  "aggs": {
    "similar_users": {
      "terms": {
        "field": "user_id.keyword",
        "size": 10
      }
    }
  }
}

通过这个查询,我们找到了所有观看过 video789 的用户列表。接下来,我们可以根据这些用户的观看历史,推荐他们喜欢的视频给当前用户。

基于协同过滤推荐其他用户喜欢的视频

找到与当前用户相似的其他用户后,我们可以查询他们共同观看的视频,并为当前用户推荐这些视频。

GET /user_actions/_search
{
  "size": 10,
  "query": {
    "terms": {
      "user_id": ["weige123", "weige456"]  # 与当前用户相似的用户
    }
  },
  "aggs": {
    "recommended_videos": {
      "terms": {
        "field": "video_id.keyword",
        "size": 5
      }
    }
  }
}

通过这个查询,可以推荐其他用户看过且当前用户还没有观看过的视频。

5. 综合推荐与实时推荐

为了提高推荐的准确性,可以将基于内容的推荐和协同过滤结合在一起,综合考虑用户的兴趣和行为数据。

结合用户兴趣和行为的推荐

首先,我们可以获取用户最喜欢的类别和标签,然后结合用户历史行为推荐符合这些兴趣的热门视频。

GET /videos/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "category": "user_favorite_category" } },
        { "match": { "tags": "user_favorite_tags" } }
      ]
    }
  },
  "sort": [
    { "release_date": { "order": "desc" } }
  ]
}

这种推荐方式综合了用户的兴趣和最新视频内容,有助于提升用户体验。

6. 结果展示与优化

在前端展示推荐结果

推荐结果可以通过前端 API 展示给用户,假设通过 JavaScript 请求 Elasticsearch 来获取推荐内容,代码示例如下:

fetch('http://localhost:9200/videos/_search', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "query": {
      "more_like_this": {
        "fields": ["title", "description", "tags"],
        "like": [
          {
            "_id": "video789"
          }
        ],
        "min_term_freq": 1,
        "max_query_terms": 12
      }
    }
  })
})
.then(response => response.json())
.then(data => {
  console.log("Recommended videos:", data.hits.hits);
  // 展示推荐视频内容
});

不断优化推荐算法

  • 用户反馈:通过用户对推荐视频的反馈(如点赞、点击等),进一步优化推荐算法。

  • 实时推荐:通过 Kafka 等流处理工具,实时监控用户行为数据,并调整推荐结果。

7. 小结一下

构建个性化推荐系统的关键在于对用户兴趣和行为的深刻理解。通过 Elasticsearch,可以轻松实现以下功能:

  • 内容推荐:基于视频内容相似性为用户推荐视频。

  • 协同过滤:基于相似用户行为推荐视频。

  • 实时推荐:结合用户实时行为和兴趣,提供最新的个性化推荐。

这种推荐系统不仅能提升用户粘性,还能增加视频播放量和广告转化率,为在线视频平台带来更多的商业收益。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐