0

私は、ユーザーが購入したいと思うかもしれないいくつかの本をユーザーに提案する必要があるアプリケーションに取り組んでいます。通常、ユーザーはすでにいくつかの本を購入している可能性があり、これらの本は設計時にはわかりません。購入していないユーザーブックに提案したい。

私は lucene.net を使用しているので、ユーザーに表示する結果からユーザーが既に購入した書籍を除外する必要があると思います。したがって、ユーザーが既に購入した BookId の任意の (配列) を除外できます。

Lucene.NET でこれを達成することは可能ですか? 可能であれば、サンプルコードを提供していただけますか? ありがとう。

4

1 に答える 1

0

購入した本の数が少ない場合は、それらをクエリに追加するだけです (... 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...
            }
        }
    }

ここにあるコード例は単なる例であり、動作するコードではありません (!)。ここから続行できると確信しています...

于 2013-08-05T08:21:30.283 に答える