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]); }
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(); } }