public void ClearAllObjects()
        {
            Initialize();

            Updating.SafeInvoke(this);

            lock (_lockObject)
            {
                using (var analyzer = new StandardAnalyzer(LuceneDefaults.Version))
                {
                    using (var writer = new IndexWriter(_indexDirectory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED))
                    {
                        _indexedObjects.Clear();
                        _searchableMetadata.Clear();

                        writer.DeleteAll();

                        writer.Optimize();
                        writer.Commit();
                    }
                }
            }

            Updated.SafeInvoke(this);
        }
        public virtual void AddObjects(IEnumerable <ISearchable> searchables)
        {
            Initialize();

            Updating.SafeInvoke(this);

            lock (_lockObject)
            {
                using (var analyzer = new StandardAnalyzer(LuceneDefaults.Version))
                {
                    using (var writer = new IndexWriter(_indexDirectory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED))
                    {
                        foreach (var searchable in searchables)
                        {
                            var index = _currentIndex++;
                            _indexedObjects.Add(index, searchable);
                            _searchableIndexes.Add(searchable, index);

                            var document = new Document();
                            document.Add(new Field(IndexId, index.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));

                            var metadata            = searchable.MetadataCollection;
                            var searchableMetadatas = metadata.All.OfType <ISearchableMetadata>();

                            foreach (var searchableMetadata in searchableMetadatas)
                            {
                                var searchableMetadataValue         = searchableMetadata.GetValue(searchable.Instance);
                                var searchableMetadataValueAsString = ObjectToStringHelper.ToString(searchableMetadataValue);

                                var field = new Field(searchableMetadata.SearchName, searchableMetadataValueAsString, Field.Store.YES, searchableMetadata.Analyze ? Field.Index.ANALYZED : Field.Index.NOT_ANALYZED, Field.TermVector.NO);

                                document.Add(field);

                                if (!_searchableMetadata.ContainsKey(searchableMetadata.SearchName))
                                {
                                    _searchableMetadata.Add(searchableMetadata.SearchName, searchableMetadata);
                                }
                            }

                            writer.AddDocument(document);
                        }

                        writer.Optimize();
                        writer.Commit();
                    }
                }
            }

            Updated.SafeInvoke(this);
        }
        public virtual void RemoveObjects(IEnumerable <ISearchable> searchables)
        {
            Initialize();

            lock (_lockObject)
            {
                Updating.SafeInvoke(this);

                using (var analyzer = new StandardAnalyzer(LuceneDefaults.Version))
                {
                    using (var writer = new IndexWriter(_indexDirectory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED))
                    {
                        foreach (var searchable in searchables)
                        {
                            int index;
                            if (!_searchableIndexes.TryGetValue(searchable, out index))
                            {
                                continue;
                            }

                            var queryAsText = $"{IndexId}:{index}";
                            var parser      = new QueryParser(LuceneDefaults.Version, string.Empty, analyzer);
                            var query       = parser.Parse(queryAsText);

                            writer.DeleteDocuments(query);

                            _searchableIndexes.Remove(searchable);
                            _indexedObjects.Remove(index);
                        }

                        writer.Optimize();
                        writer.Commit();
                    }
                }

                Updated.SafeInvoke(this);
            }
        }