2013-08-04 2 views
0

나는 그가 구매하고 싶은 책을 사용자에게 제안해야하는 응용 프로그램을 작성 중입니다. 일반적으로 사용자가 이미 일부 책을 구입했을 수 있으며 디자인 타임에이 책을 알 수 없습니다. 내가 구입하지 않은 사용자 책을 제안하고 싶습니다.Lucene.Net 결과를 필터링하고 ID 배열을 제외하는 방법?

lucene.net을 사용하고 있기 때문에 사용자가 이미 구입 한 책을 제외하고 사용자에게 표시해야한다고 생각합니다. 따라서 사용자가 이미 구매 한 임의의 BookId를 제외 할 수 있습니다.

Lucene.NET에서이를 수행 할 수 있습니까? 가능한 경우 샘플 코드를 제공해 주시겠습니까? 감사.

답변

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... 
      } 
     } 
    } 

코드 예제는 여기

+0

안녕하세요 오므리 ...하지 작업 코드 (!), 난 당신이 여기에서 계속 확신 만 예입니다. 코드를 보내 주셔서 감사합니다. 하지만 SingleFieldCache를 찾지 못하는 것 같습니까? 어디에 있습니까? Lucene이 아니에요? – Sleek

+0

O. 여기서 SingleFieldCache를 찾을 수 있습니다 (github.com/devhost/Corelicious/blob/master/Corelicious.Lucene/...). 또는 lucene 내장 필드 캐시 "FieldCache_Fields.DEFAULT.GetInts"를 사용할 수 있습니다. – Omri

관련 문제