繁体   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