2009-01-06 48 views
0

我想知道如何使用Lucene.NET进行索引和搜索我的业务实体。我看到NHibernate.Search有这个问题很好的功能,但它仍然需要数据库。我不需要数据库,我只想将所有数据存储在我的Lucene.NET索引中。我也看到像Compass这样的java框架可以很容易地完成这些工作,但它不是.NET库。如何使用Lucene.Net索引和搜索业务实体?

对象设计或框架有什么方法可以解决这个问题吗?

回答

1

试试这个代码用Lucene.NET索引一个快照的实体企业 .., 这对类型属性的明显的局限性,需要错误检查,但给你如何实现这一总体思路..

public class IndexHelper 
{ 
    static Analyzer analyzer = new StandardAnalyzer(); 
    // Store the index in memory: 
    static Directory directory = new RAMDirectory(); 
    static IndexWriter iwriter; 

    static Dictionary<string, List<WeakReference>> indexedObjects = new Dictionary<string, List<WeakReference>>(); 

    static IndexHelper() 
    { 
     iwriter = new IndexWriter(directory, analyzer, true); 
     iwriter.SetMaxFieldLength(25000); 
    } 

    public static void IndexObject(object entity) 
    { 
     Document doc = new Document(); 
     PropertyInfo[] entityProperties = entity.GetType().GetProperties(); 
     string entityKey = entity.GetHashCode().ToString(); 

     List<WeakReference> entityList; 

     if (indexedObjects.TryGetValue(entityKey, out entityList) == false) 
     { 
      entityList = new List<WeakReference>(); 
      indexedObjects.Add(entityKey, entityList); 
     } 

     entityList.Add(new WeakReference(entity)); 

     doc.Add(new Field("@HASH", entityKey, Field.Store.YES, Field.Index.UN_TOKENIZED)); 

     foreach (PropertyInfo pInfo in entityProperties) 
     { 
      String propertyName = pInfo.Name; 
      object propertyValue = pInfo.GetValue(entity, null); //Assuming all properties are of non index type 
      String text = "null"; 
      if (propertyValue != null) text = propertyValue.ToString(); 

      doc.Add(new Field(propertyName, text, Field.Store.YES, 
       Field.Index.TOKENIZED)); 
     } 

     iwriter.AddDocument(doc); 
     iwriter.Close(); 

    } 

    public static List<WeakReference> Search(string queryString, string fieldName) 
    { 
     // Now search the index: 
     IndexSearcher isearcher = new IndexSearcher(directory); 

     Lucene.Net.QueryParsers.QueryParser qp = new Lucene.Net.QueryParsers.QueryParser(fieldName, analyzer); 
     qp.SetDefaultOperator(Lucene.Net.QueryParsers.QueryParser.OR_OPERATOR); 
     qp.SetLowercaseExpandedTerms(true); 


     Query query = qp.Parse(queryString); 

     List<WeakReference> results = new List<WeakReference>(); 
     Hits hits = isearcher.Search(query); 
     // Iterate through the results: 
     for (int i = 0; i < hits.Length(); i++) 
     { 
      Document hitDoc = hits.Doc(i); 

      List<WeakReference> matchedObjects; 

      if (indexedObjects.TryGetValue(hitDoc.GetField("@HASH").StringValue(), out matchedObjects)) 
      { 
       results.AddRange(matchedObjects); 
      } 

     } 

     isearcher.Close(); 

     return results; 
    } 
} 

更新:还应考虑这个项目http://www.codeplex.com/linqtolucene