2010-03-29 107 views
7

我已經爲添加的每個文檔創建了一個包含各種數據位的索引,每個文檔可以在字段名稱上有所不同。Lucene.NET和在具有特定值的多個字段上搜索

後來,當我來到尋找我需要精確字段/值進行查詢索引 - 例如:

FieldName1 = X AND FieldName2 = Y AND FieldName3 = Z 

什麼是構建以下使用Lucene .NET的最佳方式:

  • 什麼分析儀最適合用於這種完全匹配類型?
  • 檢索匹配時,我只需要返回一個特定字段(我將其添加到每個文檔中) - 是否應該只存儲這個字段?
  • 稍後我需要支持關鍵字搜索(所以一個字段可以有一個值列表,我需要做一個部分匹配)。

該字段和數值來自Dictionary<string, string>。它不是用戶輸入,它是由代碼構建的。

感謝,
基隆

回答

7

好吧,我想通了,最終 - 這是我對其採取(這可能是完全錯誤的,但它適用於):

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