[英]Lucene.Net How to Filter Results and Exclude an Array of IDs?
我正在开发一个应用程序,该应用程序需要向用户建议一些他可能想购买的书。 通常,用户可能已经购买了一些书籍,而在设计时我们还不知道这些书籍。 我想向用户建议他尚未购买的书籍。
由于我正在使用lucene.net,因此我认为我需要从结果中排除用户已经购买的书,以显示给用户。 因此,我可以排除用户已经购买的任意(数组)BookIds。
是否可以在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...
}
}
}
这里的代码示例仅是示例,而不是有效的代码(!),我敢肯定您可以从这里继续...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.