我正在开发一个应用程序,该应用程序需要向用户建议他可能想要购买的一些书籍。通常,用户可能已经购买了一些书籍,而我们在设计时并不知道这些书籍。我想向他没有购买的用户推荐书籍。
由于我使用的是 lucene.net,我认为我需要做的是从结果中排除用户已经购买的书籍以显示给用户。所以我可以排除用户已经购买的任意(数组)BookIds。
是否有可能在 Lucene.NET 中实现这一点?如果可能,您能否提供示例代码?谢谢。
我正在开发一个应用程序,该应用程序需要向用户建议他可能想要购买的一些书籍。通常,用户可能已经购买了一些书籍,而我们在设计时并不知道这些书籍。我想向他没有购买的用户推荐书籍。
由于我使用的是 lucene.net,我认为我需要做的是从结果中排除用户已经购买的书籍以显示给用户。所以我可以排除用户已经购买的任意(数组)BookIds。
是否有可能在 Lucene.NET 中实现这一点?如果可能,您能否提供示例代码?谢谢。
如果购买的书籍数量很少,您可以将它们添加到查询中(... AND NOT bookid:1 AND NOT bookid:2 ... etc)。
Query mainQuery = new Query();
// you code here...
if (purchasedBooks.Count > 0)
{
BooleanQuery filterPurchasedBooksQuery = new BooleanQuery();
foreach (int bookId in purchasedBooks)
{
filterPurchasedBooksQuery.Add(new TermQuery(new Term("BookId", bookId.ToString())), Occur.MUST_NOT);
}
Query.Add(filterPurchasedBooksQuery, Occur.MUST);
}
// do search
如果购买的书籍数量很大,您不想这样做(性能方面),您应该编写自己的收藏家(覆盖您当前的收藏家)并丢弃购买的书籍。
public abstract class YOURCollector : WHATEVER_COLLECTOER_THAT_YOU_ARE_USING
{
public List<int> PurchasedBooks { get; set; }
public int?[] bookIds;
public override void SetNextReader(IndexReader reader, int base_Renamed)
{
docBase = base_Renamed;
bookIds = SingleFieldCache.Default.GetInt32s(reader, "BookId");
}
public override void Collect(int doc)
{
if (bookIds[doc].HasValue
&& PurchasedBooks.Contains(bookIds[doc].Value) == false)
{
base.Collect(doc);
}
else
{
// book already purchased...
}
}
}
这里的代码示例只是示例,不是工作代码(!),我相信你可以从这里继续......