2013-03-08 2 views
3

Я недавно начал работать с Lucene.Net и у меня есть некоторые проблемы: я использовал IndexWriter в индекс моих документов в C:\\TestIndex, который я предполагаю, что это работает, так как она породила несколько .fnm, .frq, .cfx, .tii, .tis файлов.Почему Lucent.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/

EDIT - (Люк будет работать с индексами lucene и lucene.net, вам нужно будет установить java для использования)

EDIT

Обновление линии

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

Я получаю эту ошибку с Luke: «Несовместимый формат версии: 2 ожидается 1 или ниже» EDIT - я нашел обходное решение, я думаю –

+0

Есть данные в моем индексе –

+0

Хороший знак вы можете выполнить поиск? Попробуйте «текст: утро» – Dreamwalker

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, новый StandardAnalyzer (Version.LUCENE_29), true, IndexWriter.MaxFieldLength.UNLIMITED); –

+0

@ BogdanŞara Я обновил свой ответ. – volpav

+0

Спасибо, все еще не работает. Я подозреваю, что это может быть связано с моими рекомендациями по решению, возможно, у меня нет соответствующей настройки –

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 требует, чтобы сказать ему, на каком поле (ы) (название, содержание ...) вы хотите запустить свой запрос.

Смежные вопросы