public Search ( SearchRequest request ) : SearchResults | ||
request | SearchRequest | |
return | SearchResults |
public SearchResults Search(SearchRequest request)
{
if (!OpenReader())
{
return new SearchResults { Query = request.Query };
}
if (!reader.IsCurrent())
{
reader = reader.Reopen();
}
var take = request.Take > 0 ? request.Take : SearchModuleConstants.DefaultSearchResultsCount;
var skip = request.Skip > 0 ? request.Skip : 0;
var result = new List<SearchResultItem>();
TopScoreDocCollector collector = TopScoreDocCollector.Create(take + skip, true);
using (var searcher = new IndexSearcher(reader))
{
var searchQuery = request.Query;
Query query;
try
{
query = parser.Parse(searchQuery);
}
catch (ParseException)
{
try
{
searchQuery = QueryParser.Escape(searchQuery);
query = parser.Parse(searchQuery);
}
catch (ParseException exc)
{
throw new ValidationException(() => exc.Message, exc.Message, exc);
}
}
Filter isPublishedFilter = null;
if (!RetrieveUnpublishedPages())
{
var isPublishedQuery = new TermQuery(new Term(LuceneIndexDocumentKeys.IsPublished, "true"));
isPublishedFilter = new QueryWrapperFilter(isPublishedQuery);
}
if (LuceneSearchHelper.Search != null)
{
collector = LuceneSearchHelper.Search(query, isPublishedFilter, collector);
}
else
{
query = LuceneEvents.Instance.OnSearchQueryExecuting(query, searchQuery).Query;
if (isPublishedFilter != null)
{
// Exclude unpublished pages
searcher.Search(query, isPublishedFilter, collector);
}
else
{
// Search within all the pages
searcher.Search(query, collector);
}
}
ScoreDoc[] hits = collector.TopDocs(skip, take).ScoreDocs;
var hitDocuments = new List<Document>();
for (int i = 0; i < hits.Length; i++)
{
int docId = hits[i].Doc;
Document d = searcher.Doc(docId);
hitDocuments.Add(d);
result.Add(
new SearchResultItem
{
FormattedUrl = d.Get(LuceneIndexDocumentKeys.Path),
Link = d.Get(LuceneIndexDocumentKeys.Path),
Title = d.Get(LuceneIndexDocumentKeys.Title),
Snippet = GetSnippet(d.Get(LuceneIndexDocumentKeys.Content), request.Query)
});
}
CheckAvailability(result);
LuceneEvents.Instance.OnSearchResultRetrieving(hitDocuments, result);
}
return new SearchResults
{
Items = result,
Query = request.Query,
TotalResults = collector.TotalHits
};
}
public void Should_Return_Correct_Search_Results() { var document1 = new HtmlDocument(); document1.DocumentNode.AppendChild(HtmlNode.CreateNode("<title>Test title</title>")); document1.DocumentNode.AppendChild(HtmlNode.CreateNode("<body><p>Body with search phrase test</p></body>")); var document2 = new HtmlDocument(); document2.DocumentNode.AppendChild(HtmlNode.CreateNode("<title>Test title</title>")); document2.DocumentNode.AppendChild(HtmlNode.CreateNode("<body><p>Body without search phrase</p></body>")); var page1 = new PageData { AbsolutePath = "/test-1", Content = document1, Id = Guid.NewGuid(), IsPublished = true}; var page2 = new PageData { AbsolutePath = "/test-2", Content = document2, Id = Guid.NewGuid(), IsPublished = true }; var service = new DefaultIndexerService(Container.Resolve<ICmsConfiguration>(), Container.Resolve<IRepository>(), Container.Resolve<ISecurityService>(), Container.Resolve<IAccessControlService>()); if (service.OpenWriter()) { service.AddHtmlDocument(page1); service.AddHtmlDocument(page2); service.CloseWriter(); } var results = service.Search(new SearchRequest("test")); Assert.IsNotNull(results.Items); Assert.AreEqual(results.Items.Count, 1, "Should return one item."); Assert.IsTrue(results.Items[0].Link == page1.AbsolutePath); }