1. 存储商品数据的数据类型
为了支持推荐搜索,商品数据通常需要包含以下字段:
商品索引结构
PUT /products
{
"mappings": {
"properties": {
"product_id": {
"type": "keyword" // 商品 ID
},
"title": {
"type": "text", // 商品标题
"analyzer": "standard"
},
"description": {
"type": "text" // 商品描述
},
"category": {
"type": "keyword" // 商品类别
},
"price": {
"type": "float" // 商品价格
},
"vector_field": {
"type": "dense_vector", // 商品的向量表示
"dims": 128 // 向量维度(根据模型决定)
}
}
}
}
字段说明:
product_id
:唯一标识商品。title
和description
:用于文本搜索。category
:用于过滤或分类推荐。price
:用于价格范围筛选。vector_field
:商品的向量表示,通常通过预训练模型生成(如 Sentence-BERT),用于相似性搜索。
2. 用户画像的定义
用户画像可以包括用户的兴趣、行为、偏好等信息。例如:
- 用户的兴趣标签(如 "电子产品"、"运动")。
- 用户的历史行为(如购买过、收藏 、分享 或 点击过的商品 ID)。
- 用户的嵌入向量(如果使用深度学习模型生成用户画像)。
假设用户画像如下:
{
"user_id": "user_123",
"interests": ["electronics", "gaming"],
"history_product_ids": ["prod_001", "prod_002"],
"user_vector": [0.1, 0.2, ..., 0.9] // 用户的向量表示
}
3. DSL 查询示例
场景 1:基于用户历史行为推荐
如果用户有历史购买记录或浏览记录,可以根据这些记录推荐相似的商品。
POST /products/_search
{
"size": 5,
"query": {
"bool": {
"should": [
{
"terms": {
"product_id": ["prod_001", "prod_002"] // 用户历史商品 ID
}
},
{
"match": {
"category": "electronics" // 用户兴趣类别
}
}
]
}
}
}
场景 2:基于用户画像向量推荐
如果用户有嵌入向量(user_vector
),可以通过 knn 搜索找到与用户向量最相似的商品。
POST /products/_search
{
"knn": {
"field": "vector_field",
"query_vector": [0.1, 0.2, ..., 0.9],
"k": 10, // 返回最相似的 5 个商品
"num_candidates": 100 // 候选 100 个商品
},
"fields": [ "title", "description", "price" ]
}
场景 3:结合用户画像和文本搜索
如果用户输入了关键词(如 "keyword"),可以结合文本搜索和用户画像进行推荐。
POST /products/_search
{
"knn": {
"field": "vector_field",
"query_vector": [0.1, 0.2, ..., 0.9],
"k": 5,
"num_candidates": 50,
"filter": {
"match": {
"title": "keyword"
}
}
},
"fields": [
"title",
"description",
"price"
],
"_source": false
}
4. 如何生成商品向量和用户向量
商品向量
使用预训练的语言模型(如 Sentence-BERT)对商品的标题和描述生成向量。例如:
python
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
# 商品标题和描述
product_title = "Wireless Gaming Mouse"
product_description = "High precision wireless gaming mouse with RGB lighting."
# 将标题和描述拼接后生成向量
text = f"{product_title} {product_description}"
product_vector = model.encode(text)
print("Product Vector:", product_vector)
用户向量
同样,可以将用户的历史行为(如购买的商品名称、兴趣标签)拼接成一段文本,并生成向量。例如:
python
# 用户兴趣标签和历史行为
user_interests = "electronics gaming"
user_history = "Gaming Laptop Wireless Mouse"
# 拼接后生成向量
user_text = f"{user_interests} {user_history}"
user_vector = model.encode(user_text)
print("User Vector:", user_vector)
生成向量参考:
使用Ollama通过预训练模型获取句子向量(rest api方式)-CSDN博客
Windows Anaconda使用Sentence-BERT获取句子向量-CSDN博客
5. 优化推荐效果
-
多因素加权:
- 结合用户的兴趣标签、历史行为和嵌入向量进行加权推荐。
- 例如,在布尔查询中为不同条件设置不同的权重。
-
个性化排序:
- 使用
_score
对结果进行排序,优先返回与用户画像最匹配的商品。
- 使用
-
冷启动问题:
- 如果新用户没有足够的历史数据,可以基于热门商品或类别进行推荐。
-
性能优化:
- 对大规模数据集,使用分片和副本优化索引性能。
- 调整
ef_search
和ef_construction
参数以平衡搜索精度和速度。
总结
-
商品数据存储:
- 使用
dense_vector
存储商品的向量表示。 - 其他字段(如标题、类别、价格)用于辅助搜索。
- 使用
-
用户画像:
- 包括兴趣标签、历史行为和嵌入向量。
-
DSL 查询:
- 根据用户画像生成推荐查询。
- 结合文本搜索、k-NN 搜索和布尔查询实现个性化推荐。
-
向量化工具:
- 使用 Sentence-BERT 等模型生成商品和用户的向量。