Corrected search index bug preventing dynamic items from being indexed if they didn't have a common aspect

- Added a lock on write operations
- Changed Indexing event handler to intercept all ContentPart instances

--HG--
branch : dev
This commit is contained in:
Sebastien Ros
2010-07-29 15:44:15 -07:00
parent 78493d3f75
commit 8d9925a75b
5 changed files with 69 additions and 49 deletions

View File

@@ -114,19 +114,23 @@ namespace Lucene.Services {
} }
public void CreateIndex(string indexName) { public void CreateIndex(string indexName) {
var writer = new IndexWriter(GetDirectory(indexName), _analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); lock ( _appDataFolder ) {
writer.Close(); var writer = new IndexWriter(GetDirectory(indexName), _analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
writer.Close();
}
Logger.Information("Index [{0}] created", indexName); Logger.Information("Index [{0}] created", indexName);
} }
public void DeleteIndex(string indexName) { public void DeleteIndex(string indexName) {
new DirectoryInfo(_appDataFolder.MapPath(_appDataFolder.Combine(_basePath, indexName))) lock ( _appDataFolder ) {
.Delete(true); new DirectoryInfo(_appDataFolder.MapPath(_appDataFolder.Combine(_basePath, indexName)))
.Delete(true);
var settingsFileName = GetSettingsFileName(indexName); var settingsFileName = GetSettingsFileName(indexName);
if(File.Exists(settingsFileName)) { if (File.Exists(settingsFileName)) {
File.Delete(settingsFileName); File.Delete(settingsFileName);
}
} }
} }
@@ -146,25 +150,27 @@ namespace Lucene.Services {
// Remove any previous document for these content items // Remove any previous document for these content items
Delete(indexName, indexDocuments.Select(i => i.ContentItemId)); Delete(indexName, indexDocuments.Select(i => i.ContentItemId));
var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED); lock ( _appDataFolder ) {
LuceneDocumentIndex current = null; var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
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);
}
}
catch (Exception ex) {
Logger.Error(ex, "An unexpected error occured while add the document [{0}] from the index [{1}].", current.ContentItemId, indexName);
}
finally {
writer.Optimize();
writer.Close();
} }
}
catch ( Exception ex ) {
Logger.Error(ex, "An unexpected error occured while add the document [{0}] from the index [{1}].", current.ContentItemId, indexName);
}
finally {
writer.Optimize();
writer.Close();
} }
} }
@@ -177,25 +183,28 @@ namespace Lucene.Services {
return; return;
} }
var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED); lock ( _appDataFolder ) {
try { var writer = new IndexWriter(GetDirectory(indexName), _analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
var query = new BooleanQuery();
try { try {
foreach (var id in documentIds) { var query = new BooleanQuery();
query.Add(new BooleanClause(new TermQuery(new Term("id", id.ToString())), BooleanClause.Occur.SHOULD));
}
writer.DeleteDocuments(query); 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);
}
} }
catch (Exception ex) { finally {
Logger.Error(ex, "An unexpected error occured while removing the documents [{0}] from the index [{1}].", String.Join(", ", documentIds), indexName); writer.Close();
} }
} }
finally {
writer.Close();
}
} }
public IDocumentIndex New(int documentId) { public IDocumentIndex New(int documentId) {

View File

@@ -47,6 +47,7 @@ namespace Lucene.Services {
InitPendingClause(); InitPendingClause();
} }
public ISearchBuilder Parse(string defaultField, string query) { public ISearchBuilder Parse(string defaultField, string query) {
return Parse(new string[] {defaultField}, query); return Parse(new string[] {defaultField}, query);
} }

View File

@@ -1,4 +1,5 @@
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.FieldStorage.InfosetStorage;
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.Core.Common.Models; using Orchard.Core.Common.Models;
using Orchard.Tasks.Indexing; using Orchard.Tasks.Indexing;
@@ -21,16 +22,18 @@ namespace Orchard.Indexing.Handlers {
_indexingTaskManager = indexingTaskManager; _indexingTaskManager = indexingTaskManager;
_indexNotifierHandlers = indexNotifierHandlers; _indexNotifierHandlers = indexNotifierHandlers;
OnPublishing<ContentPart<CommonPartRecord>>(CreateIndexingTask); OnPublishing<ContentPart>(CreateIndexingTask);
OnRemoved<ContentPart<CommonPartRecord>>(RemoveIndexingTask); OnRemoved<ContentPart>(RemoveIndexingTask);
} }
void CreateIndexingTask(PublishContentContext context, ContentPart<CommonPartRecord> part) { void CreateIndexingTask(PublishContentContext context, ContentPart part) {
_indexingTaskManager.CreateUpdateIndexTask(context.ContentItem); _indexingTaskManager.CreateUpdateIndexTask(context.ContentItem);
UpdateIndex();
} }
void RemoveIndexingTask(RemoveContentContext context, ContentPart<CommonPartRecord> part) { void RemoveIndexingTask(RemoveContentContext context, ContentPart part) {
_indexingTaskManager.CreateDeleteIndexTask(context.ContentItem); _indexingTaskManager.CreateDeleteIndexTask(context.ContentItem);
UpdateIndex();
} }
private void UpdateIndex() { private void UpdateIndex() {

View File

@@ -13,15 +13,20 @@ namespace Orchard.Indexing.Handlers {
OnIndexing<InfosetPart>( OnIndexing<InfosetPart>(
(context, cp) => { (context, cp) => {
var infosetPart = context.ContentItem.As<InfosetPart>(); var infosetPart = context.ContentItem.As<InfosetPart>();
if ( infosetPart != null ) { if (infosetPart == null) {
foreach ( var part in infosetPart.ContentItem.Parts ) { return;
foreach ( var field in part.PartDefinition.Fields ) { }
if ( field.Settings.GetModel<FieldIndexing>().Included ) {
var fieldName = field.Name; // part fields
var value = part.Fields.Where(f => f.Name == fieldName).First().Storage.Get<string>(null); foreach ( var part in infosetPart.ContentItem.Parts ) {
context.DocumentIndex.Add(String.Format("{0}-{1}", infosetPart.TypeDefinition.Name, fieldName.ToLower()), value).RemoveTags().Analyze(); foreach ( var field in part.PartDefinition.Fields ) {
} if (!field.Settings.GetModel<FieldIndexing>().Included) {
continue;
} }
var fieldName = field.Name;
var value = part.Fields.Where(f => f.Name == fieldName).First().Storage.Get<string>(null);
context.DocumentIndex.Add(String.Format("{0}-{1}", infosetPart.TypeDefinition.Name.ToLower(), fieldName.ToLower()), value).RemoveTags().Analyze();
} }
} }
}); });

View File

@@ -103,8 +103,10 @@ namespace Orchard.Indexing.Services {
// nothing to do ? // nothing to do ?
if (taskRecords.Length + updateIndexDocuments.Count == 0) if (taskRecords.Length + updateIndexDocuments.Count == 0) {
Logger.Information("Index update requested, nothing to do");
return; return;
}
Logger.Information("Processing {0} indexing tasks", taskRecords.Length); Logger.Information("Processing {0} indexing tasks", taskRecords.Length);