Exemplo n.º 1
0
        public override IEnumerable <T> Run(CompositeNode rootnode)
        {
            GenerateQuery(rootnode);
            var ids = LuceneSearchHelper.GetIds(Type, BaseQuery).ToList();

            if (ids.IsEmpty() && !string.IsNullOrEmpty(BaseQuery.ToString()))
            {
                ids.Add(0);
            }
            return(Run(ids));
        }
Exemplo n.º 2
0
        public override IEnumerable <T> Run(CompositeNode rootnode, ref IFutureValue <long> count)
        {
            GenerateQuery(rootnode);
            var ids = LuceneSearchHelper.GetIds(Type, BaseQuery).ToList();

            if (ids.IsEmpty() && !string.IsNullOrEmpty(BaseQuery.ToString()))
            {
                ids.Add(0);
            }

            var hql = "from " + Type.FullName + " _this ";

            if (ids.HasItems())
            {
                hql += " where _this." + Metadata.IdentifierPropertyName + " in (" + string.Join(",", ids) + ")";
            }
            count = new DetachedQuery("select count(*) " + hql).FutureValue <T, long>();
            return(Run(ids));
        }
Exemplo n.º 3
0
        public void Should_Fire_Lucene_Helper_Delegate_Event()
        {
            luceneSearchDelegateFired = false;

            if (LuceneSearchHelper.Search != null)
            {
                LuceneSearchHelper.Search(new BooleanQuery(), null, null);
            }
            System.Threading.Thread.Sleep(10);
            Assert.IsFalse(luceneSearchDelegateFired);

            LuceneSearchHelper.Search += delegate
            {
                luceneSearchDelegateFired = true;
                return(null);
            };

            if (LuceneSearchHelper.Search != null)
            {
                LuceneSearchHelper.Search(new BooleanQuery(), null, null);
            }
            System.Threading.Thread.Sleep(10);
            Assert.IsTrue(luceneSearchDelegateFired);
        }
Exemplo n.º 4
0
        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;
                List <Document> 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
            });
        }