public IFilter MultiMatch <TObj>(string query, IEnumerable <MatchField <TObj> > fields) { var resultContainer = new ConcurrentDictionary <int, double>(); var terms = _tokinizer.GetTokens(query.ToLower()); var termIds = terms.Select(x => new { id = _vocabulary.GetIndex(x.Term), term = x.Term }).Where(x => x.id != -1); foreach (var termId in termIds) { foreach (var field in fields) { var fieldName = field.field.GetExpressionName(); var docScore = _searchEngine.SearchForTerm(termId.id, fieldName); foreach (var score in docScore) { var docTempScore = resultContainer.GetOrAdd(score.DocumentId, 0); var newScore = docTempScore + (score.Score * field.Boost); resultContainer.TryUpdate(score.DocumentId, newScore, docTempScore); } } } _queryDocumants = resultContainer.OrderByDescending(x => x.Value).Select(x => new DocumentScore() { DocumentId = x.Key, Score = x.Value }).ToList(); return(this); }
public IEnumerable <SearchHit <TObj> > Search <TObj>(string str, int numberOfDocuments) where TObj : class { var resultContainer = new ConcurrentDictionary <int, double>(); var terms = _tokinizer.GetTokens(str.ToLower()); var termIds = terms.Select(x => new { id = _vocabulary.GetIndex(x.Term), term = x.Term }).Where(x => x.id != -1); foreach (var termId in termIds) { var docScore = SearchForTerm(termId.id); foreach (var score in docScore) { var docTempScore = resultContainer.GetOrAdd(score.DocumentId, 0); var newScore = docTempScore + score.Score; resultContainer.TryUpdate(score.DocumentId, newScore, docTempScore); } } return(resultContainer.OrderByDescending(x => x.Value).Take(numberOfDocuments).Select(x => new SearchHit <TObj>() { Score = x.Value, Document = _documentStorage.Get <TObj>(x.Key) })); }