2012-05-07 4 views
0

EDITLucene.NET Поиск по фразе, не возвращающей результатов

Хорошо, я справился. Когда я добавлял термины по одному к объекту PhraseQuery, он сохранял общие слова. В случае это было «The».

Вместо этого я использовал объект QueryParser для синтаксического анализа запроса (включая кавычки). Это уменьшает общие слова, и теперь запрос фразы работает как шарм.

List<string> searchList = Regex.Matches(searchTerms, @"(?<match>\w+)|\""(?<match>[\w\s]*)""") 
        .Cast<Match>() 
        .Select(m => m.Groups["match"].Value) 
        .ToList(); 

QueryParser parser = new QueryParser(LuceneFields.BODY, Analyzer); 
BooleanQuery booleanQuery = new BooleanQuery(); 

// go through each term 
foreach (string term in searchList) 
{ 
    Query query = null; 
    if (term.Contains(" ")) // multi word phrase 
    query = parser.Parse("\"" + term + "\""); 
    else 
    query = parser.Parse(term); 
    if (query.ToString() != "") 
    booleanQuery.Add(query, BooleanClause.Occur.MUST); 
} 

Я создаю простой поиск с помощью Lucene.Net и я имею немного проблемы при получении фразы поиска, чтобы работать должным образом, как я комбинируя его с логическим запросом.

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

List<string> searchList = Regex.Matches(searchTerms, @"(?<match>\w+)|\""(?<match>[\w\s]*)""") 
        .Cast<Match>() 
        .Select(m => m.Groups["match"].Value) 
        .ToList(); 

QueryParser parser = new QueryParser(LuceneFields.BODY, Analyzer); 
BooleanQuery booleanQuery = new BooleanQuery(); 

// go through each term 
foreach (string term in searchList) 
{ 
    Query query = null; 

    if (term.Contains(" ")) // multi word phrase 
    { 
    query = new PhraseQuery(); 
    foreach (string str in term.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) 
    { 
     ((PhraseQuery)query).Add(new Term(LuceneFields.BODY, str)); 
    } 
    } 
    else 
    query = parser.Parse(term); 

    string strQuery = query.ToString(); 

    if (query.ToString() != "") 
    booleanQuery.Add(query, BooleanClause.Occur.MUST); 
} 

Я проверил запрос который создается и выглядит нормально для меня:

+body:"The following table" 

И я также подтвердил этот текст фактически находится в индексе Lucene, как вы можете видеть из результата поиска, только для поиска «таблицы»

Я нахожусь в недоумении на самом деле, что может быть проблемой.

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

Directory = FSDirectory.Open(new System.IO.DirectoryInfo(IndexDirectory)); 
Analyzer = new StandardAnalyzer(Version); 

using (IndexWriter indexWriter = new IndexWriter(Directory, Analyzer, new IndexWriter.MaxFieldLength(Int32.MaxValue))) 
{ 
    Response.Write("Adding document..."); 
    Document document = new Document(); 

    // Store the IDDataContent 
    document.Add(new Field(LuceneFields.ID, id.ToString(), Field.Store.YES, Field.Index.ANALYZED)); 

    // store the url to the file itself 
    document.Add(new Field(LuceneFields.HREF, FileURL, Field.Store.YES, Field.Index.ANALYZED)); 

    //document.Add(new Field(LuceneFields.TITLE, Article.Title, Field.Store.YES, Field.Index.ANALYZED)); 

    // store the text of the PDF 
    document.Add(new Field(LuceneFields.BODY, PdfContents, Field.Store.YES, Field.Index.ANALYZED)); 
    indexWriter.AddDocument(document); 
    indexWriter.Optimize(); 
    indexWriter.Commit(); 
} 
+0

вы попробуйте запустить запрос с помощью фразы Люк? – Mikos

+0

Запрос с использованием Luke возвращает ожидаемый результат – Rollcredit

ответ

0
  • Проверьте, если вы используете тот же анализатор при индексировании и поиске.
  • Проверьте, действительно ли термины, которые вы ищете, существуют в индексе. (Используя Лука)
+0

Я использую тот же анализатор для индексирования и поиска, и поиск дает ожидаемый результат с помощью Luke. – Rollcredit

0

Попробуйте использовать whitespaceanalyzer в standardanalyzer не будет работать в таком случае

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