mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-04-24 19:08:18 +08:00
Prevent the search index to have two documents for the same content item
--HG-- branch : dev
This commit is contained in:
parent
21328875f3
commit
a7c0664984
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<int> 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user