2010-03-29 30 views
7

Tôi đã tạo chỉ mục với các bit dữ liệu khác nhau cho mỗi tài liệu tôi đã thêm, mỗi tài liệu có thể khác nhau trong tên trường.Lucene.NET và tìm kiếm trên nhiều trường có giá trị cụ thể

Sau đó, khi tôi đến để tìm kiếm các chỉ số tôi cần phải truy vấn nó với lĩnh vực/giá trị chính xác - ví dụ:

FieldName1 = X AND FieldName2 = Y AND FieldName3 = Z 

cách tốt nhất để xây dựng bằng cách sử dụng sau đây Lucene NET là gì:

  • Máy phân tích nào là tốt nhất để sử dụng cho loại đối sánh chính xác này?
  • Khi truy xuất một trận đấu, tôi chỉ cần một trường cụ thể được trả lại (mà tôi thêm vào mỗi tài liệu) - đây có phải là trường duy nhất được lưu trữ không?
  • Sau đó, tôi sẽ cần hỗ trợ tìm kiếm từ khóa (vì vậy một trường có thể có danh sách các giá trị và tôi sẽ cần thực hiện đối sánh một phần).

Trường và giá trị đến từ Dictionary<string, string>. Nó không phải là đầu vào của người dùng, nó được xây dựng từ mã.

Cảm ơn,
Kieron

Trả lời

7

Vâng, tôi figured it out cuối cùng - đây là quan điểm của tôi về nó (điều này có thể là hoàn toàn sai, nhưng nó hoạt động cho):

public Guid? Find (Dictionary<string, string> searchTerms) 
{ 
    if (searchTerms == null) 
     throw new ArgumentNullException ("searchTerms"); 

    try 
    { 
      var directory = FSDirectory.Open (new DirectoryInfo (IndexRoot)); 
      if (!IndexReader.IndexExists (directory)) 
       return null; 

      var mainQuery = new BooleanQuery(); 
      foreach (var pair in searchTerms) 
      { 
       var parser = new QueryParser (
        Lucene.Net.Util.Version.LUCENE_CURRENT, pair.Key, GetAnalyzer()); 
       var query = parser.Parse (pair.Value); 

       mainQuery.Add (query, BooleanClause.Occur.MUST); 
      } 

      var searcher = new IndexSearcher (directory, true); 

      try 
      { 
       var results = searcher.Search (mainQuery, (Filter)null, 10); 
       if (results.totalHits != 1) 
        return null; 

       return Guid.Parse (searcher.Doc (results.scoreDocs[0].doc).Get (ContentIdKey)); 
      } 
      catch 
      { 
       throw; 
      } 
      finally 
      { 
       if (searcher != null) 
        searcher.Close(); 
      } 
    } 
    catch 
    { 
      throw; 
    } 
} 
Các vấn đề liên quan