コード例 #1
0
        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);
        }
コード例 #2
0
        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)
            }));
        }