簡體   English   中英

Lucene.Net如何過濾結果並排除ID數組?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM