Exemplo n.º 1
0
        private IndexSearcher Acquire(Type documentType, bool maybeReopen)
        {
            if (documentType == null)
            {
                throw new ArgumentNullException("documentType");
            }
            if (!typeof(IDefineDocument).IsAssignableFrom(documentType))
            {
                throw new ArgumentException(string.Format(
                                                "Invalid documentType: '{0}' is not assignable from '{1}'.",
                                                documentType, typeof(IDefineDocument)), "documentType");
            }

            var directory = _documentStore.GetDirectory(documentType);

            if (!_currentSearchers.ContainsKey(directory) || _currentSearchers[directory] == null)
            {
                _currentSearchers.TryAdd(directory, new IndexSearcher(IndexReader.Open(directory, true)));
                _reopenings.TryAdd(directory, false);
            }
            if (maybeReopen)
            {
                MaybeReopen(documentType);
            }
            _currentSearchers[directory].IndexReader.IncRef();
            return(_currentSearchers[directory]);
        }
Exemplo n.º 2
0
        public void Index()
        {
            const Version version   = Version.LUCENE_30;
            var           analyzer  = new PerFieldAnalyzerWrapper(new StandardAnalyzer(version));
            var           directory = _documents.GetDirectory <PlaceDocument>();
            var           writer    = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);

            writer.DeleteAll();
            var       skip   = 0;
            const int take   = 1000;
            const int sleep  = 10;
            var       places = _entities.Query <Place>()
                               .EagerLoad(_entities, new Expression <Func <Place, object> >[]
            {
                x => x.Names,
                x => x.Ancestors,
            })
                               .OrderBy(x => x.RevisionId);
            var total = places.Count();

            while (skip < total)
            {
                var items = places.Skip(skip).Take(take).ToArray().Select(x => new PlaceDocument(x));
                foreach (var document in items.Select(CreateDocument))
                {
                    writer.AddDocument(document);
                }
                skip += take;
                if (skip < total)
                {
                    Thread.Sleep(sleep);
                }
            }

            try
            {
                writer.Optimize();
                writer.Dispose();
            }
            catch
            {
                writer.Rollback();
            }
        }