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

时间:2013-08-04 22:57:13

标签: c# lucene.net

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

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

是否有可能在Lucene.NET中实现这一目标?如果可能,请您提供示例代码?感谢。

1 个答案:

答案 0 :(得分:0)

如果购买的图书数量很少,您可以将它们添加到查询中(...而不是bookid:1而不是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...
            }
        }
    }

此处的代码示例仅为示例,而非工作代码(!),我确定您可以从此处继续...