2010-03-29 11 views
7

Eklediğim her belge için çeşitli veri biti olan bir dizin oluşturdum, her belge alan adında farklı olabilir. Daha sonraLucene.NET ve belirli değerlerle birden fazla alan üzerinde arama

, ben tam saha/değerlerle bunu sorgulamak gerek dizinde arama geldiğinde - örneğin: Aşağıdaki kullanarak Lucene .NET inşa etmenin en iyi yolu nedir

FieldName1 = X AND FieldName2 = Y AND FieldName3 = Z 

:

  • Bu tam eşleme türü için hangi analizör en iyi şekilde kullanılır?
  • Bir eşleşme alındıktan sonra, yalnızca döndürülecek belirli bir alana ihtiyacım var (her belgeye eklediğim) - bu yalnızca bir tanesi saklanmalı mı?
  • Daha sonra anahtar kelime aramayı desteklemem gerekecek (böylece bir alanın değerleri listesi olabilir ve kısmi bir eşleşme yapmam gerekecek).

Alanlar ve değerler Dictionary<string, string>'dan gelir. Bu kullanıcı girdisi değil, koddan oluşturuldu.

sayesinde
Kieron

cevap

7

Eh, sonunda anladım - şurada üzerine almak benim (bu tamamen yanlış olabilir, ama bunun için çalışır):

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; 
    } 
} 
İlgili konular