* Preserve existing Examine FieldDefinitionCollection if it already exists (#20267)
* Fix missing bracket
* Minor tidy/addition of comments; addition of unit tests.
---------
Co-authored-by: Andy Butland <abutland73@gmail.com>
(cherry picked from commit 908974c6ac)
77 lines
3.6 KiB
C#
77 lines
3.6 KiB
C#
using Examine;
|
|
using Examine.Lucene;
|
|
using Examine.Lucene.Analyzers;
|
|
using Lucene.Net.Analysis.Standard;
|
|
using Lucene.Net.Index;
|
|
using Microsoft.Extensions.Options;
|
|
using Umbraco.Cms.Core;
|
|
using Umbraco.Cms.Core.Configuration.Models;
|
|
|
|
namespace Umbraco.Cms.Infrastructure.Examine.DependencyInjection;
|
|
|
|
/// <summary>
|
|
/// Configures the index options to construct the Examine indexes.
|
|
/// </summary>
|
|
public sealed class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
|
|
{
|
|
private readonly IndexCreatorSettings _settings;
|
|
private readonly IUmbracoIndexConfig _umbracoIndexConfig;
|
|
private readonly IDeliveryApiContentIndexFieldDefinitionBuilder _deliveryApiContentIndexFieldDefinitionBuilder;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="ConfigureIndexOptions"/> class.
|
|
/// </summary>
|
|
public ConfigureIndexOptions(
|
|
IUmbracoIndexConfig umbracoIndexConfig,
|
|
IOptions<IndexCreatorSettings> settings,
|
|
IDeliveryApiContentIndexFieldDefinitionBuilder deliveryApiContentIndexFieldDefinitionBuilder)
|
|
{
|
|
_umbracoIndexConfig = umbracoIndexConfig;
|
|
_settings = settings.Value;
|
|
_deliveryApiContentIndexFieldDefinitionBuilder = deliveryApiContentIndexFieldDefinitionBuilder;
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public void Configure(string? name, LuceneDirectoryIndexOptions options)
|
|
{
|
|
// When creating FieldDefinitions with Umbraco defaults, pass in any already defined to avoid overwriting
|
|
// those added via a package or custom code.
|
|
switch (name)
|
|
{
|
|
case Constants.UmbracoIndexes.InternalIndexName:
|
|
options.Analyzer = new CultureInvariantWhitespaceAnalyzer();
|
|
options.Validator = _umbracoIndexConfig.GetContentValueSetValidator();
|
|
options.FieldDefinitions = new UmbracoFieldDefinitionCollection(options.FieldDefinitions);
|
|
break;
|
|
case Constants.UmbracoIndexes.ExternalIndexName:
|
|
options.Analyzer = new StandardAnalyzer(LuceneInfo.CurrentVersion);
|
|
options.Validator = _umbracoIndexConfig.GetPublishedContentValueSetValidator();
|
|
options.FieldDefinitions = new UmbracoFieldDefinitionCollection(options.FieldDefinitions);
|
|
break;
|
|
case Constants.UmbracoIndexes.MembersIndexName:
|
|
options.Analyzer = new CultureInvariantWhitespaceAnalyzer();
|
|
options.Validator = _umbracoIndexConfig.GetMemberValueSetValidator();
|
|
options.FieldDefinitions = new UmbracoFieldDefinitionCollection(options.FieldDefinitions);
|
|
break;
|
|
case Constants.UmbracoIndexes.DeliveryApiContentIndexName:
|
|
options.Analyzer = new StandardAnalyzer(LuceneInfo.CurrentVersion);
|
|
// NOTE: we do not use a validator here, because the populator does all the heavy lifting
|
|
options.FieldDefinitions = _deliveryApiContentIndexFieldDefinitionBuilder.Build();
|
|
break;
|
|
}
|
|
|
|
// ensure indexes are unlocked on startup
|
|
options.UnlockIndex = true;
|
|
|
|
if (_settings.LuceneDirectoryFactory == LuceneDirectoryFactory.SyncedTempFileSystemDirectoryFactory)
|
|
{
|
|
// if this directory factory is enabled then a snapshot deletion policy is required
|
|
options.IndexDeletionPolicy = new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy());
|
|
}
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public void Configure(LuceneDirectoryIndexOptions options)
|
|
=> throw new NotImplementedException("This is never called and is just part of the interface");
|
|
}
|