/// <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 })); }
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]); } } }