示例#1
0
        /// <summary>
        /// Searches Index for
        /// </summary>
        /// <param name="query">What is searched for</param>
        /// <param name="count">How many results gets back</param>
        /// <param name="sortFunctionDesc">Sorts results with the same weight descending</param>
        /// <returns></returns>
        public IEnumerable <Result <T> > Search(string query, int count, Func <T, int> sortFunctionDescending = null)
        {
            var tokenizedQuery = _tokenizer.Tokenize(query);

            List <ScoredSentence <T> > results = new List <ScoredSentence <T> >();

            foreach (string queryToken in tokenizedQuery)
            {
                // tokeny, které odpovídají query
                var filteredTokens = SortedTokens
                                     .Where(t => t.Key.StartsWith(queryToken))
                                     .Select(x => x.Value);


                foreach (var token in filteredTokens)
                {
                    var scoredSentences = ScoreToken(token, queryToken);
                    results.AddRange(scoredSentences);
                }
            }

            var summedResults = results
                                .GroupBy(r => r.Sentence,
                                         (sentence, result) => new ScoredSentence <T>(sentence, result.Sum(x => x.Score)))
                                .ToList();

            // přidat score za nejdelší řetězec
            foreach (ScoredSentence <T> result in summedResults)
            {
                result.Score += ScoreSentence(result.Sentence, tokenizedQuery);
            }

            if (sortFunctionDescending is null)
            {
                return(summedResults
                       .OrderByDescending(x => x.Score)
                       .Take(count)
                       .Select(x => new Result <T>()
                {
                    Original = x.Sentence.Original,
                    Score = x.Score
                }));
            }

            return(summedResults
                   .OrderByDescending(x => x.Score)
                   .ThenByDescending(x => sortFunctionDescending(x.Sentence.Original))
                   .Take(count)
                   .Select(x => new Result <T>()
            {
                Original = x.Sentence.Original,
                Score = x.Score
            }));
        }
示例#2
0
 private void AddTokens(List <Token <T> > tokens)
 {
     for (int i = 0; i < tokens.Count(); i++)
     {
         if (SortedTokens.TryGetValue(tokens[i].Word, out Token <T> olderToken))
         {
             olderToken.MergeWith(tokens[i]);
         }
         else
         {
             SortedTokens.Add(tokens[i].Word, tokens[i]);
         }
     }
 }