Lucene.Net我做错了什么?

dno*_*oxs 5 lucene.net

我对lucene.net很新.我在C#中编写了这个简单的控制台应用程序,用于索引一些假数据 然后我希望能够使用booleanquery在索引中搜索各种术语.

我再也没有得到任何结果.这是代码.任何帮助将不胜感激.谢谢.

    static void Main(string[] args)
    {
        StandardAnalyzer analyzer = new StandardAnalyzer();
        IndexWriter writer = new IndexWriter("Test", analyzer, true);
        Console.WriteLine("Creating index");
        for (int i = 0; i < 1500; i++)
        {
            Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
            doc.Add(new Lucene.Net.Documents.Field("A", i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
            doc.Add(new Lucene.Net.Documents.Field("B", "LALA" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
            doc.Add(new Lucene.Net.Documents.Field("C", "DODO" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
            doc.Add(new Lucene.Net.Documents.Field("D", i.ToString() + " MMMMM", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
            writer.AddDocument(doc);
        }            
        writer.Optimize();
        writer.Close();

        BooleanQuery query = new BooleanQuery();
        query.Add(new WildcardQuery(new Term("B", "lala*")), Lucene.Net.Search.BooleanClause.Occur.MUST);
        query.Add(new WildcardQuery(new Term("C", "DoDo1*")), Lucene.Net.Search.BooleanClause.Occur.MUST);

        IndexSearcher searcher = new IndexSearcher("Test");
        Hits hits = searcher.Search(query);
        if (hits.Length() > 0)
        {
            for (int i = 0; i < hits.Length(); i++)
            {
                Console.WriteLine("{0} - {1} - {2} - {3}", 
                    hits.Doc(i).GetField("A").StringValue(),
                    hits.Doc(i).GetField("B").StringValue(),
                    hits.Doc(i).GetField("C").StringValue(),
                    hits.Doc(i).GetField("D").StringValue());
            }
        }
        searcher.Close();

        Console.WriteLine("Done");

        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

然后我通过使用MultiFieldQueryParser让它工作如下:

    static void Main(string[] args)
    {
        StandardAnalyzer analyzer = new StandardAnalyzer();            

        IndexWriter writer = new IndexWriter("Test", analyzer, true);
        Console.WriteLine("Creating index");
        for (int i = 0; i < 1500; i++)
        {
            Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
            doc.Add(new Lucene.Net.Documents.Field("A", i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
            doc.Add(new Lucene.Net.Documents.Field("B", "LALA" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
            doc.Add(new Lucene.Net.Documents.Field("C", "DODO" + i.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
            doc.Add(new Lucene.Net.Documents.Field("D", i.ToString() + " MMMMM", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED));
            writer.AddDocument(doc);
        }            
        writer.Optimize();
        writer.Close();            

        BooleanQuery.SetMaxClauseCount(5000);
        Query query = MultiFieldQueryParser.Parse(new string[] { "LALA*", "DODO*" }, new string[] { "B", "C" }, analyzer); 

        IndexSearcher searcher = new IndexSearcher("Test");
        Hits hits = searcher.Search(query);
        if (hits.Length() > 0)
        {
            for (int i = 0; i < hits.Length(); i++)
            {
                Console.WriteLine("{0} - {1} - {2} - {3}", 
                    hits.Doc(i).GetField("A").StringValue(),
                    hits.Doc(i).GetField("B").StringValue(),
                    hits.Doc(i).GetField("C").StringValue(),
                    hits.Doc(i).GetField("D").StringValue());
            }
        }
        searcher.Close();

        Console.WriteLine("Done");

        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

这可能是我为任何新的lucene开发人员找到的最好的文章:http://www.ifdefined.com/blog/post/2009/02/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx

Lau*_*ble 5

我认为构建索引时存在问题.您为每个文档添加了四个字段,所有这些字段都已存储,但没有一个被索引(=> Lucene.Net.Documents.Field.Index.NO).您应该至少在字段上编制索引.

请注意,StandardAnalyzer会以下列方式对每个字段索引进行标记:使用常见的英语停用词进行小写和拆分.因此,在构建查询时,请使用LOWERCASE前缀以获得命中:

query.Add(new PrefixQuery(new Term("B", "lala")), BooleanClause.Occur.MUST);
query.Add(new PrefixQuery(new Term("C", "dodo")), BooleanClause.Occur.MUST);
Run Code Online (Sandbox Code Playgroud)