为什么Lucene.NET IndexSearcher返回零结果?

时间:2013-03-08 11:01:43

标签: c# indexing lucene.net

我最近开始使用Lucene.NET,但我遇到了一些问题:我使用IndexWriter索引C:\\TestIndex中的文档,我认为它有效,因为它生成了几个.fnm.frq.cfx.tii.tis个文件。

问题是当试图通过它们进行简单搜索时,我从来没有得到任何结果。以下是我使用的代码,

using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;

//Provide the directory where index is stored
Directory directory = FSDirectory.Open(newSystem.IO.DirectoryInfo(@"C:\\TestIndex")); 

IndexReader indexReader = IndexReader.Open(directory, true);
Searcher indexSearch = new IndexSearcher(indexReader);

Analyzer std = new StandardAnalyzer(Version.LUCENE_29);
QueryParser parser = new QueryParser(Version.LUCENE_29, "text", std);
Query qry = parser.Parse("morning");

// true opens the index in read only mode
Searcher srchr = new IndexSearcher(IndexReader.Open(directory, true));

TopScoreDocCollector cllctr = TopScoreDocCollector.Create(100, true);

ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
srchr.Search(qry, cllctr); 

for (int i = 0; i < hits.Length; i++)
{
    int docId = hits[i].Doc;
    float score = hits[i].Score;
    Document doc = srchr.Doc(docId);
    Console.WriteLine("Searched from Text: " + doc.Get("text"));
}

我尝试了几种方法,但我从来没有得到任何结果。你有什么主意吗?

下面是索引代码,

IndexWriter indexWriter = 
    new IndexWriter(
        luceneDir, 
        new StandardAnalyzer(Version.LUCENE_29), 
        true, 
        IndexWriter.MaxFieldLength.UNLIMITED);

string[] listOfFiles = Directory.GetFiles(@"C:\Projects\lucene.net-trunk\build\vs2010\demo\MyTestProject\TestDocs");

foreach (string s in listOfFiles)
{
    String content = File.ReadAllText(s);
    Document doc = new Document();
    String title = s;

    // adding title field
    doc.Add(new Field("title", title, Field.Store.YES, Field.Index.NOT_ANALYZED));  
    doc.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));

    indexWriter.AddDocument(doc);
}

indexWriter.Optimize();
indexWriter.Dispose();

3 个答案:

答案 0 :(得分:2)

使用luke检查索引以确保其具有数据,您也可以执行搜索以验证搜索条件

http://www.getopt.org/luke/

编辑 - (Luke将使用lucene和lucene.net索引,你需要安装java才能使用)

修改

更新专栏

Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", std);

使用

Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", std);

您已将默认搜索字段设置为text,但不存在

您还试图在console.write

中获取错误的字段

答案 1 :(得分:0)

确保在编制索引和搜索时使用相同的分析器(在您的情况下,我猜是StandardAnalyzer):

using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Store;

...

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(@"C:\\TestIndex"));

var writer = new IndexWriter(
    directory, 
    new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), 
    true, 
    new MaxFieldLength(int.MaxValue));

<强>更新

我使用稍微不同的搜索方法但是,无论如何,也许你需要交换这两行:

ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
srchr.Search(qry, cllctr); 

所以它变成了:

srchr.Search(qry, cllctr); 
ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;

意味着收集器首先在执行搜索时收集结果,然后通过收集器实例获取得分文档。

答案 2 :(得分:0)

您可以尝试明确指定您正在搜索的字段吗?例如:

    Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", std);
    Lucene.Net.Search.Query qry = parser.Parse("content: morning");

我认为Lucene要求您告诉它您要在哪个字段(标题,内容......)上运行查询。