public Searcher Create()
 {
     return(new IndexSearcher(_readerFactory.Create()));
 }
示例#2
0
        public IEnumerable <IRow> Read()
        {
            using (var reader = _readerFactory.Create()) {
                var numDocs  = reader.NumDocs();
                var selector = new MapFieldSelector(_fields.Select(f => f.Name).ToArray());

                using (var searcher = _searcherFactory.Create()) {
                    // read from input?  consider filters, and field names
                    if (_readFrom == ReadFrom.Input)
                    {
                        if (_context.Entity.Filter.Any())
                        {
                            var queryFields = _context.Entity.Filter.Select(f => f.Field).ToArray();
                            var query       = string.Join(" ", _context.Entity.Filter.Select(f => "(" + (string.IsNullOrEmpty(f.Expression) ? f.Field + ":" + f.Value : f.Expression) + ") " + f.Continuation.ToUpper()));
                            query = query.Remove(query.Length - 3);
                            var topFieldCollector = TopFieldCollector.Create(Sort.INDEXORDER, numDocs, false, false, false, false);

                            searcher.Search(new MultiFieldQueryParser(V, queryFields, _analyzer).Parse(query), topFieldCollector);

                            var topDocs = topFieldCollector.TopDocs();

                            if (topDocs == null)
                            {
                                yield break;
                            }

                            for (var i = 0; i < topDocs.TotalHits; i++)
                            {
                                var row = _rowFactory.Create();
                                var doc = searcher.Doc(i, selector);
                                foreach (var field in _fields)
                                {
                                    row[field] = field.Convert(doc.Get(field.Name));
                                }
                                yield return(row);
                            }
                        }
                        else
                        {
                            for (var i = 0; i < numDocs; i++)
                            {
                                if (reader.IsDeleted(i))
                                {
                                    continue;
                                }
                                var doc = reader.Document(i, selector);
                                var row = _rowFactory.Create();
                                foreach (var field in _fields)
                                {
                                    row[field] = field.Convert(doc.Get(field.Name));
                                }
                                yield return(row);
                            }
                        }
                    }
                    else // read from output? consider tfldeleted and field aliases

                    {
                        var tflDeleted = _context.Entity.TflDeleted();
                        var collector  = TopFieldCollector.Create(Sort.INDEXORDER, numDocs, false, false, false, false);
                        searcher.Search(LuceneConversion.TypeSearch(tflDeleted, tflDeleted.Alias, false), collector);

                        var topDocs = collector.TopDocs();

                        if (topDocs == null)
                        {
                            yield break;
                        }

                        for (var i = 0; i < topDocs.TotalHits; i++)
                        {
                            var row = _rowFactory.Create();
                            var doc = searcher.Doc(i, selector);
                            foreach (var field in _fields)
                            {
                                row[field] = field.Convert(doc.Get(field.Alias));
                            }
                            yield return(row);
                        }
                    }
                }
            }
        }
 public Searcher Create()
 {
     _reader = _readerFactory.Create();
     return(new IndexSearcher(_reader));
 }