Customizing field indexing

All the data types marked with [SearchableType] attribute are processed by an internal class DataTypeDocumentSource, however one can extend how certain fields are processed to f.e. change the way the facet fields values are extracted, or replacing reference values with searchable text. To do that one can register an implementation of the IDataFieldProcessorProvider interface in a startup handler.

In the following example we will customize search indexing for the Composite.Community.Blog package.

The startup handler:

    [ApplicationStartup]
    public class Startup
    {
        public static void ConfigureServices(IServiceCollection collection)
        {
            collection.AddSingleton<IDataFieldProcessorProvider>(new BlogDataFieldProcessorProvider());
        }

        public static void OnBeforeInitialize() {}
        public static void OnInitialized(){}
    }

Implementation of IDataFieldProcessorProvider that would return custom processors for the “Tags” and “Teaser” fields:

internal class BlogDataFieldProcessorProvider: IDataFieldProcessorProvider
{
  public IDataFieldProcessor GetDataFieldProcessor(PropertyInfo dataTypeProperty)
  {
	  if (dataTypeProperty.DeclaringType.FullName == "Composite.Community.Blog.Entries")
	  {
		  if (dataTypeProperty.Name == "Tags")
		  {
			  return new TagsDataFieldProcessor();
		  }

		  if (dataTypeProperty.Name == "Teaser")
		  {
			  return new TeaserDataFieldProcessor();
		  }
	  }
	  return null;
  }
}

For the “Tags” field, we will split the value into multiple values and mark that the facet is multivalued:

internal class TagsDataFieldProcessor : DefaultDataFieldProcessor
{
	public override string[] GetFacetValues(object value)
	{
		var str = (string) value;
		return str.Split(',');
	}

	public override DocumentFieldFacet GetDocumentFieldFacet(PropertyInfo propertyInfo)
	{
		var result = base.GetDocumentFieldFacet(propertyInfo);

		result.FacetType = FacetType.MultipleValues;

		return result;
	}
}

For the “Teaser” field, we want the text to appear in the already existing “Description” column of the search results:

internal class TeaserDataFieldProcessor : DefaultDataFieldProcessor
{
	public override string GetDocumentFieldName(PropertyInfo pi)
	{
		return DocumentFieldNames.Description;
	}
}