public SearchSecurityTrimmer(IndexSearcher searcher, SecurityCheckerDelegate securityChecker, LuceneQuery luceneQuery)
 {
     _securityChecker = securityChecker;
     _searcher        = searcher;
     _query           = luceneQuery;
     _hitDocs         = new List <ScoreDoc>(16);
 }
 public SearchSecurityTrimmer(IndexSearcher searcher, SecurityCheckerDelegate securityChecker, LuceneQuery luceneQuery)
 {
     _securityChecker = securityChecker;
     _searcher = searcher;
     _query = luceneQuery;
     _hitDocs = new List<ScoreDoc>(16);
 }
 public SearchSecurityTrimmer(SearchSecurityTrimmerContext searchContext)
 {
     _securityChecker = searchContext.SecurityChecker;
     _searcher = searchContext.Searcher;
     _luceneQuery = searchContext.LuceneQuery;
     _searchQuery = searchContext.SearchQuery;
     _hitDocs = new List<ScoreDoc>(16);
 }
Example #4
0
 public SearchSecurityTrimmer(SearchSecurityTrimmerContext searchContext)
 {
     _securityChecker = searchContext.SecurityChecker;
     _searcher        = searchContext.Searcher;
     _luceneQuery     = searchContext.LuceneQuery;
     _searchQuery     = searchContext.SearchQuery;
     _hitDocs         = new List <ScoreDoc>(16);
 }
Example #5
0
        private static StringBuilder GetSearcResultExplanation(LuceneQuery luceneQuery, IEnumerable <ScoreDoc> scoreDocs, IndexSearcher searcher)
        {
            var sb = new StringBuilder();

            sb.AppendLine("Query: " + luceneQuery.Query.ToString());
            foreach (var match in scoreDocs)
            {
                var explanation = searcher.Explain(luceneQuery.Query, match.Doc);
                sb.AppendLine("-------------------");
                var doc = searcher.Doc(match.Doc);
                sb.AppendLine(doc.Get(Constants.TitleTag));
                sb.AppendLine(explanation.ToString());
            }
            return(sb);
        }
Example #6
0
        public IEnumerable <LuceneResult> Search(
            LuceneQuery luceneQuery, out int totalHits, SecurityCheckerDelegate securityChecker = null)
        {
            Requires.NotNull("LuceneQuery", luceneQuery);
            Requires.NotNull("LuceneQuery.Query", luceneQuery.Query);
            Requires.PropertyNotEqualTo("LuceneQuery", "PageSize", luceneQuery.PageSize, 0);
            Requires.PropertyNotEqualTo("LuceneQuery", "PageIndex", luceneQuery.PageIndex, 0);

            //TODO - Explore simple highlighter as it does not give partial words
            var highlighter = FastHighlighter;
            var fieldQuery  = highlighter.GetFieldQuery(luceneQuery.Query);

            var maxResults = luceneQuery.PageIndex * luceneQuery.PageSize;
            var minResults = maxResults - luceneQuery.PageSize + 1;

            var searcher = GetSearcher();
            var topDocs  = new SearchSecurityTrimmer(searcher, securityChecker, luceneQuery);

            searcher.Search(luceneQuery.Query, null, topDocs);
            totalHits = topDocs.TotalHits;

            if (Logger.IsDebugEnabled)
            {
                var sb = GetSearcResultExplanation(luceneQuery, topDocs.ScoreDocs, searcher);
                Logger.Debug(sb);
            }

            //Page doesn't exist
            if (totalHits < minResults)
            {
                return(new List <LuceneResult>());
            }

            return(topDocs.ScoreDocs.Select(match =>
                                            new LuceneResult
            {
                Document = searcher.Doc(match.Doc),
                Score = match.Score,
                DisplayScore = GetDisplayScoreFromMatch(match.ToString()),
                TitleSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.TitleTag, luceneQuery.TitleSnippetLength),
                BodySnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.BodyTag, luceneQuery.BodySnippetLength),
                DescriptionSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.DescriptionTag, luceneQuery.TitleSnippetLength),
                TagSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.Tag, luceneQuery.TitleSnippetLength),
                AuthorSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.AuthorNameTag, luceneQuery.TitleSnippetLength),
                ContentSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.ContentTag, luceneQuery.TitleSnippetLength)
            }).ToList());
        }
 private static StringBuilder GetSearcResultExplanation(LuceneQuery luceneQuery, IEnumerable<ScoreDoc> scoreDocs, IndexSearcher searcher)
 {
     var sb = new StringBuilder();
     sb.AppendLine("Query: " + luceneQuery.Query.ToString());
     foreach (var match in scoreDocs)
     {
         var explanation = searcher.Explain(luceneQuery.Query, match.Doc);
         sb.AppendLine("-------------------");
         var doc = searcher.Doc(match.Doc);
         sb.AppendLine(doc.Get(Constants.TitleTag));
         sb.AppendLine(explanation.ToString());
     }
     return sb;
 }
        private Tuple<int, IList<SearchResult>> GetResults(SearchQuery searchQuery)
        {
            Requires.NotNull("Query", searchQuery);
            Requires.PropertyNotEqualTo("searchQuery", "SearchTypeIds", searchQuery.SearchTypeIds.Count(), 0);

            if((searchQuery.ModuleId > 0) && (searchQuery.SearchTypeIds.Count() > 1 || !searchQuery.SearchTypeIds.Contains(_moduleSearchTypeId)))
                throw new ArgumentException("ModuleId based search must have SearchTypeId for a module only");

            if(searchQuery.SortField == SortFields.CustomStringField || searchQuery.SortField == SortFields.CustomNumericField
                || searchQuery.SortField == SortFields.NumericKey || searchQuery.SortField == SortFields.Keyword)
                Requires.NotNullOrEmpty("CustomSortField", searchQuery.CustomSortField);

            //TODO - Explore Slop factor for Phrase query

            var query = new BooleanQuery();
            if (!string.IsNullOrEmpty(searchQuery.KeyWords))
            {
                try
                {
                    var keywords = SearchHelper.Instance.RephraseSearchText(searchQuery.KeyWords, searchQuery.WildCardSearch);
                    // don't use stemming analyzer for exact matches or non-analyzed fields (e.g. Tags)
                    var analyzer = new SearchQueryAnalyzer(true);
                    var nonStemmerAnalyzer = new SearchQueryAnalyzer(false);
                    var keywordQuery = new BooleanQuery();
                    foreach (var fieldToSearch in Constants.KeyWordSearchFields)
                    {
                        var parserContent = new QueryParser(Constants.LuceneVersion, fieldToSearch,
                            fieldToSearch == Constants.Tag ? nonStemmerAnalyzer : analyzer);
                        var parsedQueryContent = parserContent.Parse(keywords);
                        keywordQuery.Add(parsedQueryContent, Occur.SHOULD);
                    }
                    query.Add(keywordQuery, Occur.MUST);
                }
                catch (Exception)
                {
                    foreach (var word in searchQuery.KeyWords.Split(' '))
                    {
                        query.Add(new TermQuery(new Term(Constants.ContentTag, word.ToLower())), Occur.SHOULD);
                    }
                }
            }

            var portalIdQuery = new BooleanQuery();
            foreach (var portalId in searchQuery.PortalIds)
            {
                portalIdQuery.Add(NumericRangeQuery.NewIntRange(Constants.PortalIdTag, portalId, portalId, true, true), Occur.SHOULD);                
            }
            if (searchQuery.PortalIds.Any()) query.Add(portalIdQuery, Occur.MUST);

            ApplySearchTypeIdFilter(query, searchQuery);

            if (searchQuery.BeginModifiedTimeUtc > DateTime.MinValue && searchQuery.EndModifiedTimeUtc >= searchQuery.BeginModifiedTimeUtc)
            {
                query.Add(NumericRangeQuery.NewLongRange(Constants.ModifiedTimeTag, long.Parse(searchQuery.BeginModifiedTimeUtc.ToString(Constants.DateTimeFormat)), long.Parse(searchQuery.EndModifiedTimeUtc.ToString(Constants.DateTimeFormat)), true, true), Occur.MUST);
            }

            if(searchQuery.RoleId > 0)
                query.Add(NumericRangeQuery.NewIntRange(Constants.RoleIdTag, searchQuery.RoleId, searchQuery.RoleId, true, true), Occur.MUST);  

            foreach (var tag in searchQuery.Tags)
            {
                query.Add(new TermQuery(new Term(Constants.Tag, tag.ToLower())), Occur.MUST);
            }

            if (!string.IsNullOrEmpty(searchQuery.CultureCode))
            {
                var localeQuery = new BooleanQuery();

                var languageId = Localization.Localization.GetCultureLanguageID(searchQuery.CultureCode);
                localeQuery.Add(NumericRangeQuery.NewIntRange(Constants.LocaleTag, languageId, languageId, true, true), Occur.SHOULD);
                localeQuery.Add(NumericRangeQuery.NewIntRange(Constants.LocaleTag, Null.NullInteger, Null.NullInteger, true, true), Occur.SHOULD);
                query.Add(localeQuery, Occur.MUST);
            }



            var luceneQuery = new LuceneQuery
            {
                Query = query,
                Sort = GetSort(searchQuery),
                PageIndex = searchQuery.PageIndex,
                PageSize = searchQuery.PageSize,
                TitleSnippetLength = searchQuery.TitleSnippetLength,
                BodySnippetLength = searchQuery.BodySnippetLength
            };

            return GetSecurityTrimmedResults(searchQuery, luceneQuery);
        }
        private Tuple<int, IList<SearchResult>> GetSecurityTrimmedResults(SearchQuery searchQuery, LuceneQuery luceneQuery)
        {
            var results = new List<SearchResult>();
            var totalHits = 0;

            //****************************************************************************
            // First Fetch and determine starting item of current page
            //****************************************************************************
            if (searchQuery.PageSize > 0)
            {
                var luceneResults = LuceneController.Instance.Search(luceneQuery, out totalHits, HasPermissionToViewDoc);
                results = luceneResults.Select(GetSearchResultFromLuceneResult).ToList();

                //****************************************************************************
                //Adding URL Links to final trimmed results
                //****************************************************************************
                foreach (var result in results)
                {
                    if (string.IsNullOrEmpty(result.Url))
                    {
                        var resultController = GetSearchResultControllers().Single(sc => sc.Key == result.SearchTypeId).Value;
                        result.Url = resultController.GetDocUrl(result);
                    }
                }
            }

            return new Tuple<int, IList<SearchResult>>(totalHits, results);
        }
 private LuceneSearchContext CreateSearchContext(LuceneQuery luceneQuery)
 {
     return new LuceneSearchContext {LuceneQuery = luceneQuery, SearchQuery = _mockSearchQuery.Object };
 }
        public void LuceneController_Search_Double_FuzzyQuery()
        {
            //Arrange  
            string[] docs = {
                "home",
                "homez", // note home and homes could be returned by PorterFilter
                "fuzzy",
                "wuzzy"
                };

            string[] keywords = {
                "wuzza",
                "homy"
                };

            AddLinesAsSearchDocs(docs);

            //Act
            var finalQuery = new BooleanQuery();
            foreach (var keyword in keywords)
            {
                finalQuery.Add(new FuzzyQuery(new Term(Constants.ContentTag, keyword)), Occur.SHOULD);
            }

            var luceneQuery = new LuceneQuery { Query = finalQuery };
            var previews = _luceneController.Search(CreateSearchContext(luceneQuery));

            //Assert
            Assert.AreEqual(3, previews.Results.Count());
        }
        public void LuceneController_Search_Single_FuzzyQuery()
        {
            //Arrange  
            string[] docs = {
                "fuzzy",
                "wuzzy"
                };
            const string keyword = "wuzza";

            AddLinesAsSearchDocs(docs);

            //Act
            var luceneQuery = new LuceneQuery { Query = new FuzzyQuery(new Term(Constants.ContentTag, keyword)) };
            var previews = _luceneController.Search(CreateSearchContext(luceneQuery));

            //Assert
            Assert.AreEqual(2, previews.Results.Count());
        }
        public void LuceneController_Search_Request_For_PagIndex2_PageSize1_Returns_2nd_Record_Only()
        {
            //Arrange
            AddStandardDocs();

            var query = new LuceneQuery
                {
                    Query = new TermQuery(new Term(Constants.ContentTag, "quick")), PageIndex = 2, PageSize = 1
                };

            var hits = _luceneController.Search(CreateSearchContext(query));

            //Assert
            Assert.AreEqual(3, hits.TotalHits);
            Assert.AreEqual(1, hits.Results.Count());
            // for some reason, this search's docs have scoring as
            // Line1=0.3125, Line1=0.3125, Line2=0.3125, Line2=0.3750
            Assert.AreEqual(Line1, hits.Results.ElementAt(0).Document.GetField(Constants.ContentTag).StringValue);
        }
        public IEnumerable<LuceneResult> Search(
            LuceneQuery luceneQuery, out int totalHits, SecurityCheckerDelegate securityChecker = null)
        {
            Requires.NotNull("LuceneQuery", luceneQuery);
            Requires.NotNull("LuceneQuery.Query", luceneQuery.Query);
            Requires.PropertyNotEqualTo("LuceneQuery", "PageSize", luceneQuery.PageSize, 0);
            Requires.PropertyNotEqualTo("LuceneQuery", "PageIndex", luceneQuery.PageIndex, 0);

            //TODO - Explore simple highlighter as it does not give partial words
            var highlighter = FastHighlighter;
            var fieldQuery = highlighter.GetFieldQuery(luceneQuery.Query);

            var maxResults = luceneQuery.PageIndex*luceneQuery.PageSize;
            var minResults = maxResults - luceneQuery.PageSize + 1;

            var searcher = GetSearcher();
            var topDocs = new SearchSecurityTrimmer(searcher, securityChecker, luceneQuery);
            searcher.Search(luceneQuery.Query, null, topDocs);
            totalHits = topDocs.TotalHits;

            if (Logger.IsDebugEnabled)
            {
                var sb = GetSearcResultExplanation(luceneQuery, topDocs.ScoreDocs, searcher);
                Logger.Debug(sb);
            }

            //Page doesn't exist
            if (totalHits < minResults)
                return new List<LuceneResult>();

            return topDocs.ScoreDocs.Select(match =>
                new LuceneResult
                    {
                        Document = searcher.Doc(match.Doc),
                        Score = match.Score,
                        DisplayScore = GetDisplayScoreFromMatch(match.ToString()),
                        TitleSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.TitleTag, luceneQuery.TitleSnippetLength),
                        BodySnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.BodyTag, luceneQuery.BodySnippetLength),
                        DescriptionSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.DescriptionTag, luceneQuery.TitleSnippetLength),
                        TagSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.Tag, luceneQuery.TitleSnippetLength),
                        AuthorSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.AuthorNameTag, luceneQuery.TitleSnippetLength),
                        ContentSnippet = GetHighlightedText(highlighter, fieldQuery, searcher, match, Constants.ContentTag, luceneQuery.TitleSnippetLength)
                    }).ToList();
        }