2013-03-08 139 views
3

我最近开始Lucene.NET工作,我有一些问题:我在C:\\TestIndex我猜它的工作,因为它产生了若干.fnm.frq.cfx.tii.tis文件使用IndexWriter索引我的文档。为什么Lucene.NET IndexSearcher返回零结果?

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

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(); 

回答

2

使用卢克检查指标,以确保有数据也可以进行搜索,以验证您的搜索条件

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

错误的字段
+0

我得到这个卢克错误:“不兼容的格式版本:2预期1或更低”编辑 - 我发现一个解决方法我猜 – 2013-03-08 11:10:23

+0

我的索引中有数据 – 2013-03-08 11:14:02

+0

好的迹象,你可以执行搜索?尝试“text:morning” – Dreamwalker 2013-03-08 11:26:42

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

UPDATE

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

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

所以就变成:

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

这意味着收集程序​​首先在执行搜索时收集结果,然后通过收集器实例获取您的评分文档。

+0

下面是我的代码生成索引..它是相同: ---------------------------------------------- --------------- IndexWriter indexWriter = new IndexWriter(luceneDir,new StandardAnalyzer(Version.LUCENE_29),true,IndexWriter.MaxFieldLength.UNLIMITED); – 2013-03-08 11:17:10

+0

@BogdanŞara我已经更新了我的答案。 – volpav 2013-03-08 11:23:22

+0

谢谢,依然不起作用。我怀疑这可能与我的解决方案参考有关,也许我没有相应的设置 – 2013-03-08 11:27:21

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的需要你告诉它哪个字段(S)(标题,内容...)你想运行查询。