2013-03-08 138 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)(標題,內容...)你想運行查詢。