#5664: Lucene should page operations

Fixes #5664
This commit is contained in:
Sebastien Ros
2015-08-27 15:31:22 -07:00
parent 9a8b64393e
commit b52a846c5f
2 changed files with 38 additions and 10 deletions

View File

@@ -303,5 +303,24 @@ namespace Orchard.Tests.Modules.Indexing {
_provider.Store("default", _provider.New(1).Add("field", "value2"));
Assert.That(searchBuilder.WithField("id", "1").Count(), Is.EqualTo(1));
}
[Test]
public void IndexProviderShouldDeleteMoreThanMaxTermsCount() {
_provider.CreateIndex("default");
var documents = Enumerable.Range(1, 1025).Select(i => _provider.New(i).Add("field", "value1"));
_provider.Store("default", documents);
var searchBuilder = _provider.CreateSearchBuilder("default");
Assert.That(searchBuilder.Count(), Is.EqualTo(1025));
Assert.That(searchBuilder.Get(1).ContentItemId, Is.EqualTo(1));
Assert.That(searchBuilder.Get(1025).ContentItemId, Is.EqualTo(1025));
_provider.Delete("default", Enumerable.Range(1, 1025));
Assert.That(searchBuilder.Count(), Is.EqualTo(0));
}
}
}

View File

@@ -29,7 +29,8 @@ namespace Lucene.Services {
public static readonly Version LuceneVersion = Version.LUCENE_29;
public static readonly DateTime DefaultMinDateTime = new DateTime(1980, 1, 1);
public static readonly int BatchSize = 50;
public LuceneIndexProvider(
IAppDataFolder appDataFolder,
ShellSettings shellSettings,
@@ -152,17 +153,25 @@ namespace Lucene.Services {
}
using (var writer = new IndexWriter(GetDirectory(indexName), _analyzerProvider.GetAnalyzer(indexName), false, IndexWriter.MaxFieldLength.UNLIMITED)) {
var query = new BooleanQuery();
// Process documents by batch as there is a max number of terms a query can contain (1024 by default).
var pageCount = documentIds.Count() / BatchSize + 1;
for (int page = 0; page < pageCount; page++) {
var query = new BooleanQuery();
try {
foreach (var id in documentIds) {
query.Add(new BooleanClause(new TermQuery(new Term("id", id.ToString(CultureInfo.InvariantCulture))), Occur.SHOULD));
try {
var batch = documentIds
.Skip(page * BatchSize)
.Take(BatchSize);
foreach (var id in batch) {
query.Add(new BooleanClause(new TermQuery(new Term("id", id.ToString(CultureInfo.InvariantCulture))), 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);
}
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);
}
}
}