Question

I would like to know how to use Lucene.NET for indexing and searching my business entities. I see NHibernate.Search has nice features for this issue, but it still needs DB. I don't need DB, I only want to store all data in my Lucene.NET's index. I also see java framework like Compass can do that stuff easily, but it's not .NET library.

Is there any ways for object designs or frameworks to solve this issue?

No correct solution

OTHER TIPS

try this code to use Lucene.NET to index a snapshot of business entities.., this has obvious limitations on type of properties and needs error checking but gives you a general idea of how to achieve this..

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

Update: Also look into this project http://www.codeplex.com/linqtolucene

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top