구입 한 책 수가 적은 경우에는 쿼리에 추가 할 수 있습니다 (... 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...
}
}
}
코드 예제는 여기
안녕하세요 오므리 ...하지 작업 코드 (!), 난 당신이 여기에서 계속 확신 만 예입니다. 코드를 보내 주셔서 감사합니다. 하지만 SingleFieldCache를 찾지 못하는 것 같습니까? 어디에 있습니까? Lucene이 아니에요? – Sleek
O. 여기서 SingleFieldCache를 찾을 수 있습니다 (github.com/devhost/Corelicious/blob/master/Corelicious.Lucene/...). 또는 lucene 내장 필드 캐시 "FieldCache_Fields.DEFAULT.GetInts"를 사용할 수 있습니다. – Omri