Подтвердить что ты не робот

Точный поиск фразы с использованием Lucene.net

У меня возникли проблемы с поиском точной фразы с использованием Lucene.NET 2.0.0.4

Например, я ищу "атрибут scope устанавливает переменную" (включая кавычки), но не получает совпадений, я подтвердил 100%, что эта фраза существует.

Может кто-нибудь предложить, где я иду не так? Это даже поддерживается Lucene.NET? Как обычно, документация API не слишком полезна, и несколько статей CodeProject, которые я прочитал, не касаются этого конкретно.

Используя следующий код для создания индекса:

Directory dir = Lucene.Net.Store.FSDirectory.GetDirectory("Index", true);

Analyzer analyzer = new Lucene.Net.Analysis.SimpleAnalyzer();

IndexWriter indexWriter = new Lucene.Net.Index.IndexWriter(dir, analyzer,true);

//create a document, add in a single field
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();

Lucene.Net.Documents.Field fldContent = new Lucene.Net.Documents.Field(
    "content", File.ReadAllText(@"Documents\100.txt"),
    Lucene.Net.Documents.Field.Store.YES,
    Lucene.Net.Documents.Field.Index.TOKENIZED);

doc.Add(fldContent);

//write the document to the index
indexWriter.AddDocument(doc);

Затем я ищу фразу, используя:

//state the file location of the index
Directory dir = Lucene.Net.Store.FSDirectory.GetDirectory("Index", false);

//create an index searcher that will perform the search
IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(dir);

QueryParser qp = new QueryParser("content", new SimpleAnalyzer());

// txtSearch.Text  Contains a phrase such as "this is a phrase" 
Query q=qp.Parse(txtSearch.Text);  


//execute the query
Lucene.Net.Search.Hits hits = searcher.Search(q);

Целевой документ составляет около 7 МБ обычного текста.

Я видел этот предыдущий вопрос, однако мне не нужен поиск по близости, просто поиск точной фразы.

4b9b3361

Ответ 1

Вы не включили термин "позиции". Создание поля следующим образом должно решить вашу проблему.

Lucene.Net.Documents.Field fldContent = 
    new Lucene.Net.Documents.Field("content", 
        File.ReadAllText(@"Documents\100.txt"),
    Lucene.Net.Documents.Field.Store.YES,
    Lucene.Net.Documents.Field.Index.TOKENIZED, 
    Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS);

Ответ 2

Шашикант Коре верен своим ответом, вам нужно включить позиции позиций...

Однако я бы рекомендовал не хранить текст документа в поле, если вам не нужно его возвращать к вам в результатах поиска... Настройка хранилища на "НЕТ" может помочь уменьшить размер вашего индекса немного.

Lucene.Net.Documents.Field fldContent = 
    new Lucene.Net.Documents.Field("content", 
        File.ReadAllText(@"Documents\100.txt"),
    Lucene.Net.Documents.Field.Store.NO,
    Lucene.Net.Documents.Field.Index.TOKENIZED, 
    Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS);