購入した本の数が少ない場合は、それらをクエリに追加するだけです (... 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...
}
}
}
ここにあるコード例は単なる例であり、動作するコードではありません (!)。ここから続行できると確信しています...