[英]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.