mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-19 18:27:55 +08:00
Prevent the search index to have two documents for the same content item
--HG-- branch : dev
This commit is contained in:
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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 {
|
try {
|
||||||
foreach (var id in documentIds) {
|
var query = new BooleanQuery();
|
||||||
try {
|
|
||||||
var term = new Term("id", id.ToString());
|
try {
|
||||||
if (reader.DeleteDocuments(term) != 0) {
|
foreach (var id in documentIds) {
|
||||||
Logger.Error("The document [{0}] could not be removed from the index [{1}]", id, indexName);
|
query.Add(new BooleanClause(new TermQuery(new Term("id", id.ToString())), BooleanClause.Occur.SHOULD));
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
finally {
|
||||||
reader.Close();
|
writer.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user