BetterCMS.Module.LuceneSearch.Services.IndexerService.DefaultIndexerService.Search C# (CSharp) Метод

Search() публичный Метод

public Search ( SearchRequest request ) : SearchResults
request SearchRequest
Результат 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
                       };
        }

Usage Example

Пример #1
0
        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);
        }
All Usage Examples Of BetterCMS.Module.LuceneSearch.Services.IndexerService.DefaultIndexerService::Search