基于 Lucene 构建自定义推荐引擎方案
电商和 SNS 社区普遍采用数据挖掘算法来构建推荐引擎,像协同过滤(Item-Based、User-based)以及基于内容的推荐都是经典方案。不过落地到实际场景,尤其是中小企业,完整部署这些成熟算法的成本和门槛往往比较高。
当前面临的挑战
目前市面上与数据挖掘及推荐相关的开源项目不少,大致可以分为几类:
- 数据挖掘:Weka、R-Project、Knime、RapidMiner、Orange 等
- 文本挖掘:OpenNLP、LingPipe、FreeLing、GATE 等
- 推荐引擎:Apache Mahout、Duine framework、SVD 等
- 搜索引擎:Lucene、Solr、Sphinx、Hibernate Search 等
除了 Lucene 和 Solr 相对成熟外,大部分项目仍处于学术研究阶段,直接应用于互联网大规模的数据挖掘和推荐系统时,往往会遇到性能瓶颈或集成困难的问题。此外,传统算法实现复杂,入门门槛高,且处理海量数据时性能表现参差不齐。
为什么选择 Lucene?
对于开发能力有限的中小型网站,如果能有一套集成了搜索与推荐的一体化解决方案,那将非常实用。采用 Lucene 来实现推荐引擎主要有以下优势:
- 入门成本低:大部分网站的站内搜索已经采用了 Lucene,团队熟悉度高。
- 性能更优:相对于传统的协同过滤算法,Lucene 在处理检索任务时性能更高。
- 现成方案多:Lucene 在 Text Mining 和相似度计算方面提供了丰富的现成工具,比如 contrib 包中的 MoreLikeThis。
虽然 Mahout 或 Duine Framework 也是相对完整的推荐方案,尤其是 Mahout 核心利用了 Lucene,架构值得借鉴,但直接用它们实现电商推荐引擎可能还不够成熟。从 Mahout 的实现思路可以看出,利用 Lucene 构建推荐引擎是一条可行的路径。
需要解决的核心问题
Lucene 擅长文本挖掘,通过 MoreLikeThis 功能可以比较容易地实现 Content-Based 推荐。但在涉及用户协同过滤行为的结果(Relevance Feedback)时,Lucene 原生并没有直接的解决方案。
我们需要做的,是将用户协同过滤的行为因素融入到内容相似算法中,把用户的协同行为结果转化为 Lucene 支持的模型。
数据源从哪里来?
电子商务网站中与推荐引擎相关典型的用户行为包括:购买本商品的顾客还买过、浏览本商品的顾客还看过、喜欢此商品的人还喜欢、用户对此商品的平均打分等。
基于 Lucene 实现推荐引擎,主要要处理两大类数据:
1. 内容相似度
例如:商品名称、作者/译者/制造商、商品类别、简介、评论、用户标签、系统标签。
2. 用户协同行为相似度
例如:打标签、购买商品、点击流、搜索、收藏、打分、写评论、问答、页面停留时间、所在群组等。
具体怎么做?
内容相似度处理
这部分比较简单,基于 Lucene 的 MoreLikeThis 功能即可实现。
对用户协同行为的处理
这是关键所在,建议按以下步骤操作:
- 索引化行为:用户每一次协同行为都使用 Lucene 进行索引,每次行为一条记录。
- 记录重要信息:索引记录应包含商品名、商品 ID、类别、简介、标签等重要特征值,以及用户关联行为的其他商品特征元素、缩略图地址、协同行为类型(购买、点击、收藏、评分等)。
- 设置 Boost 权重:不同的协同行为类型设置不同的
setBoost值。比如购买行为的权重应高于点击行为,这样在搜索时能体现业务逻辑的重要性。 - 转化模型:搜索时采用 Lucene
MoreLikeThis算法,将用户协同行为转化为内容相似度进行匹配。
以上方案是基于 Lucene 实现推荐引擎较为简单的落地方式。如果需要更高的准确度,可以参考 Mahout 的算法实现来进一步优化细节。

