2010-03-29 115 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; 
    } 
}