Lucene.Net如何过滤结果并排除ID数组

本文关键字:结果 排除 ID 数组 过滤 Net 何过滤 Lucene | 更新日期: 2023-09-27 18:26:28

我正在开发一个应用程序,该应用程序需要向用户推荐一些他可能想要购买的书籍。通常,用户可能已经购买了一些书籍,而我们在设计时并不了解这些书籍。我想向用户推荐他没有购买的书籍。

由于我使用的是lucene.net,我认为我需要做的是从结果中排除用户已经购买的书籍,以显示给用户。因此,我可以排除用户已经购买的任意BookId(数组)。

有可能在Lucene.NET中实现这一点吗?如果可能的话,你能提供样本代码吗?谢谢

Lucene.Net如何过滤结果并排除ID数组

如果购买的书籍数量较少,您可以将它们添加到查询中(…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...
            }
        }
    }

这里的代码示例只是示例,而不是工作代码(!),我相信你可以从这里继续。。。