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();
}
вы попробуйте запустить запрос с помощью фразы Люк? – Mikos
Запрос с использованием Luke возвращает ожидаемый результат – Rollcredit