From a7c06649846f6f5e722ef6822e7e9854bd1faaa2 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 29 Jun 2010 12:24:09 -0700 Subject: [PATCH] Prevent the search index to have two documents for the same content item --HG-- branch : dev --- .../Indexing/LuceneIndexProviderTests.cs | 40 +++++++++++++++++++ .../Services/LuceneIndexProvider.cs | 36 +++++++++-------- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/Orchard.Tests.Modules/Indexing/LuceneIndexProviderTests.cs b/src/Orchard.Tests.Modules/Indexing/LuceneIndexProviderTests.cs index 07a35fb47..250df2ff6 100644 --- a/src/Orchard.Tests.Modules/Indexing/LuceneIndexProviderTests.cs +++ b/src/Orchard.Tests.Modules/Indexing/LuceneIndexProviderTests.cs @@ -249,5 +249,45 @@ namespace Orchard.Tests.Modules.Indexing { Assert.That(doc.IsDirty, Is.True); } + + [Test] + public void DocumentsShouldBeDeleted() { + _provider.CreateIndex("default"); + _provider.Store("default", _provider.New(1).Add("field", "value1")); + _provider.Store("default", _provider.New(11).Add("field", "value11")); + _provider.Store("default", _provider.New(111).Add("field", "value111")); + + var searchBuilder = _provider.CreateSearchBuilder("default"); + + Assert.That(searchBuilder.Get(1).ContentItemId, Is.EqualTo(1)); + Assert.That(searchBuilder.Get(11).ContentItemId, Is.EqualTo(11)); + Assert.That(searchBuilder.Get(111).ContentItemId, Is.EqualTo(111)); + + _provider.Delete("default", 1); + + Assert.That(searchBuilder.Get(1), Is.Null); + Assert.That(searchBuilder.Get(11).ContentItemId, Is.EqualTo(11)); + Assert.That(searchBuilder.Get(111).ContentItemId, Is.EqualTo(111)); + + _provider.Delete("default", new int[] {1, 11, 111 }); + + Assert.That(searchBuilder.Get(1), Is.Null); + Assert.That(searchBuilder.Get(11), Is.Null); + Assert.That(searchBuilder.Get(111), Is.Null); + + } + + [Test] + public void SameContentItemShouldNotBeIndexedTwice() { + _provider.CreateIndex("default"); + + var searchBuilder = _provider.CreateSearchBuilder("default"); + + _provider.Store("default", _provider.New(1).Add("field", "value1")); + Assert.That(searchBuilder.WithField("id", "1").Count(), Is.EqualTo(1)); + + _provider.Store("default", _provider.New(1).Add("field", "value2")); + Assert.That(searchBuilder.WithField("id", "1").Count(), Is.EqualTo(1)); + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Indexing/Services/LuceneIndexProvider.cs b/src/Orchard.Web/Modules/Orchard.Indexing/Services/LuceneIndexProvider.cs index e2271a8ec..0333687fb 100644 --- a/src/Orchard.Web/Modules/Orchard.Indexing/Services/LuceneIndexProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Indexing/Services/LuceneIndexProvider.cs @@ -6,6 +6,7 @@ using Lucene.Net.Analysis; using Lucene.Net.Analysis.Standard; using Lucene.Net.Documents; using Lucene.Net.Index; +using Lucene.Net.Search; using Lucene.Net.Store; using Orchard.Environment.Configuration; using Orchard.FileSystems.AppData; @@ -141,13 +142,18 @@ namespace Orchard.Indexing.Services { return; } + // Remove any previous document for these content items + Delete(indexName, indexDocuments.Select(i => i.ContentItemId)); + var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED); LuceneDocumentIndex current = null; try { + foreach ( var indexDocument in indexDocuments ) { current = indexDocument; var doc = CreateDocument(indexDocument); + writer.AddDocument(doc); Logger.Debug("Document [{0}] indexed", indexDocument.ContentItemId); } @@ -166,30 +172,28 @@ namespace Orchard.Indexing.Services { } public void Delete(string indexName, IEnumerable documentIds) { - if ( documentIds.AsQueryable().Count() == 0 ) { + if (!documentIds.Any()) { return; } - - var reader = IndexReader.Open(GetDirectory(indexName), false); + + var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED); try { - foreach (var id in documentIds) { - try { - var term = new Term("id", id.ToString()); - if (reader.DeleteDocuments(term) != 0) { - Logger.Error("The document [{0}] could not be removed from the index [{1}]", id, indexName); - } - else { - Logger.Debug("Document [{0}] removed from index", id); - } - } - catch (Exception ex) { - Logger.Error(ex, "An unexpected error occured while removing the document [{0}] from the index [{1}].", id, indexName); + var query = new BooleanQuery(); + + try { + foreach (var id in documentIds) { + query.Add(new BooleanClause(new TermQuery(new Term("id", id.ToString())), BooleanClause.Occur.SHOULD)); } + + writer.DeleteDocuments(query); + } + catch (Exception ex) { + Logger.Error(ex, "An unexpected error occured while removing the documents [{0}] from the index [{1}].", String.Join(", ", documentIds), indexName); } } finally { - reader.Close(); + writer.Close(); } }