Prevent the search index to have two documents for the same content item

--HG--
branch : dev
This commit is contained in:
Sebastien Ros
2010-06-29 12:24:09 -07:00
parent 21328875f3
commit a7c0664984
2 changed files with 60 additions and 16 deletions

View File

@@ -249,5 +249,45 @@ namespace Orchard.Tests.Modules.Indexing {
Assert.That(doc.IsDirty, Is.True); 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));
}
} }
} }

View File

@@ -6,6 +6,7 @@ using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard; using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents; using Lucene.Net.Documents;
using Lucene.Net.Index; using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store; using Lucene.Net.Store;
using Orchard.Environment.Configuration; using Orchard.Environment.Configuration;
using Orchard.FileSystems.AppData; using Orchard.FileSystems.AppData;
@@ -141,13 +142,18 @@ namespace Orchard.Indexing.Services {
return; 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); var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
LuceneDocumentIndex current = null; LuceneDocumentIndex current = null;
try { try {
foreach ( var indexDocument in indexDocuments ) { foreach ( var indexDocument in indexDocuments ) {
current = indexDocument; current = indexDocument;
var doc = CreateDocument(indexDocument); var doc = CreateDocument(indexDocument);
writer.AddDocument(doc); writer.AddDocument(doc);
Logger.Debug("Document [{0}] indexed", indexDocument.ContentItemId); Logger.Debug("Document [{0}] indexed", indexDocument.ContentItemId);
} }
@@ -166,30 +172,28 @@ namespace Orchard.Indexing.Services {
} }
public void Delete(string indexName, IEnumerable<int> documentIds) { public void Delete(string indexName, IEnumerable<int> documentIds) {
if ( documentIds.AsQueryable().Count() == 0 ) { if (!documentIds.Any()) {
return; return;
} }
var reader = IndexReader.Open(GetDirectory(indexName), false); var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
try {
var query = new BooleanQuery();
try { try {
foreach (var id in documentIds) { foreach (var id in documentIds) {
try { query.Add(new BooleanClause(new TermQuery(new Term("id", id.ToString())), BooleanClause.Occur.SHOULD));
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);
} }
writer.DeleteDocuments(query);
} }
catch (Exception ex) { catch (Exception ex) {
Logger.Error(ex, "An unexpected error occured while removing the document [{0}] from the index [{1}].", id, indexName); Logger.Error(ex, "An unexpected error occured while removing the documents [{0}] from the index [{1}].", String.Join(", ", documentIds), indexName);
}
} }
} }
finally { finally {
reader.Close(); writer.Close();
} }
} }