揭秘12306如何保证车票不的关键技术!(组图)
优采云 发布时间: 2021-05-19 23:26揭秘12306如何保证车票不的关键技术!(组图)
我正在休假,为什么显示有票却无法获得票?揭秘12306的关键技术,如何确保票证不会超卖! >>>
推荐系统经常在现代网站中使用。不同类型的操作需要不同的推荐策略,并且推荐策略必须简单易懂,这可以方便操作和维护人员进行手动调整。本文以全文搜索引擎为例,说明如何自定义推荐系统。
###基本原理推荐系统的基本原理是首先分析相关产品,例如
"male age18 1000 1010 1020 ..."
此处的“ 1”是产品的ID。当18岁的男性用户注意两种产品“ 1000 1020”时,他会使用条件
"male age18 1000 1020"
搜索,获取收录所有条件的文本,然后向用户推荐产品“ 1010”。
###实时推荐某些流行的相关产品仅售卖了几天,之后相关性迅速减弱,需要实时推荐。实时推荐的原理是记录每个用户在一天中(或最近几天)长时间浏览的产品。当新用户也正在寻找类似产品时,请向该新用户推荐曾经浏览过同一产品的前几个用户。用户
####实现这些功能的代码可以使用全文本搜索引擎来实现。以FTServer使用的引擎为例。当用户关注产品时,将产品用作文本内容,并将用户用作文本ID来生成searchindex dailyEngine .indexText(),此索引等效于复合主键(product-user ),则每当涉及到新产品时,都会调用FavorWhenStay10Sec()。此函数包括用于生成搜索索引的代码indexText()以及用于记录用户注意力的iBoxDB数据库** insert()**操作
private static void FavorWhenStay10Sec(Engine dailyEngine, AutoBox autoDaily, long userId, long itemId) {
try (Box box = autoDaily.cube()) {
box.d("/Favor").insert(new Favor(userId, itemId));
dailyEngine.indexText(box, userId, Long.toString(itemId));
box.commit();
}
}
当新用户注意两个产品“ 1055 1058”时,将这两个产品用作全文搜索关键字进行搜索
RealTimeRecommendPrint(engine, autoDaily, new long[]{1055, 1058});
通过dailyEngine.searchDistinct()搜索方法,可以获得使用相同产品的用户(生成索引时设置的文本ID为用户ID)
for (KeyWord kw
: dailyEngine.searchDistinct(box, sb.toString(), startId, HowManyUsersAsReference)) {
long userId = kw.getID();
....
}
然后建议将具有相同兴趣的用户吸引到新用户
for (Favor favor : box.select(Favor.class, "from /Favor where userId == ?", userId)) {
System.out.print(favor.itemId + ",");
}
此处,HowManyUsersAsReference设置返回的用户数。由于具有实时推荐功能,因此在很多情况下不必让所有用户都具有相同的爱好。
###深入推荐当大量用户关注数据时,无需由单个用户来组织数据。可以定制各种算法来分析产品的关联,或者可以手动分析产品的关联,然后回到第一部分关于实现的基本原理,具体的实现代码与直接调用完整搜索引擎,将多个相关产品的ID形成文本,然后输入全文索引,当产品ID与推荐中的产品ID匹配时,该文本与其他产品ID相关,即推荐内容。
源代码下载
更多:全文搜索中精确匹配和分词匹配的比较