Lucene.Net如何过滤结果并排除ID数组
本文关键字:结果 排除 ID 数组 过滤 Net 何过滤 Lucene | 更新日期: 2023-09-27 18:26:28
我正在开发一个应用程序,该应用程序需要向用户推荐一些他可能想要购买的书籍。通常,用户可能已经购买了一些书籍,而我们在设计时并不了解这些书籍。我想向用户推荐他没有购买的书籍。
由于我使用的是lucene.net,我认为我需要做的是从结果中排除用户已经购买的书籍,以显示给用户。因此,我可以排除用户已经购买的任意BookId(数组)。
有可能在Lucene.NET中实现这一点吗?如果可能的话,你能提供样本代码吗?谢谢
如果购买的书籍数量较少,您可以将它们添加到查询中(…AND NOT bookid:1 AND NOT bookid=2…等等)。
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...
}
}
}
这里的代码示例只是示例,而不是工作代码(!),我相信你可以从这里继续。。。