Exemple #1
0
        public IEnumerable <IDictionary> Read(Query query)
        {
            var docIx          = new DocIndexReader(DocIndexStream);
            var docs           = new DocReader(DocStream);
            var keyIx          = new ValueIndexReader(KeyIndexStream);
            var valIx          = new ValueIndexReader(ValueIndexStream);
            var keyReader      = new ValueReader(KeyStream);
            var valReader      = new ValueReader(ValueStream);
            var postingsReader = new PostingsReader(PostingsStream);

            var keyHash = query.Term.Key.ToString().ToHash();
            var ix      = GetIndex(keyHash);
            var match   = ix.ClosestMatch(query.Term.Value.ToString());
            var docIds  = postingsReader.Read(match.PostingsOffset, match.PostingsSize);

            foreach (var docId in docIds)
            {
                var docInfo = docIx.Read(docId);
                var docMap  = docs.Read(docInfo.offset, docInfo.length);
                var doc     = new Dictionary <IComparable, IComparable>();

                for (int i = 0; i < docMap.Count; i++)
                {
                    var kvp   = docMap[i];
                    var kInfo = keyIx.Read(kvp.keyId);
                    var vInfo = valIx.Read(kvp.valId);
                    var key   = keyReader.Read(kInfo.offset, kInfo.len, kInfo.dataType);
                    var val   = valReader.Read(vInfo.offset, vInfo.len, vInfo.dataType);

                    doc[key] = val;
                }

                yield return(doc);
            }
        }
Exemple #2
0
        /// <summary>
        /// Find each query term's corresponding index node and postings list and perform "AND", "OR" or "NOT" set operations on them.
        /// </summary>
        /// <param name="query"></param>
        private ScoredResult MapReduce(Query query)
        {
            Map(query);

            var timer = Stopwatch.StartNew();

            var result = new PostingsReader(_postingsStream).Reduce(query.ToClauses(), query.Skip, query.Take);

            this.Log("map/reduce took {0}", timer.Elapsed);

            return(result);
        }