Implement and configure a computed field in your index
Implement and configure a computed field in your index
Computed fields let you add entirely new fields in your Coveo organization, in addition to the Sitecore template fields.
You can implement a computed field using the following steps:
Step 1: Implement the computed field
-
Create a new C# class library project called
Coveo.Custom
. You’ll need to reference theSitecore.ContentSearch
assembly. -
Create a new class that inherits from
Sitecore.ContentSearch.ComputedFields.IComputedIndexField
.using System; using Sitecore; using Sitecore.ContentSearch; using Sitecore.ContentSearch.ComputedFields; namespace Coveo.Custom { public class MyComputedField : IComputedIndexField { /// <remarks> /// This property should be left empty. Instead, use the FieldName attribute in the configuration file to /// specify the name of the computed field. /// </remarks> public string FieldName { get; set; } /// <remarks> /// This property can optionally be used to specify the data type of the Sitecore field being currently processed. So instead of /// being automatically handled as a string (which is the default behavior), the field will be converted into the corresponding /// Coveo data type. If you leave the property as is, the value returned by ComputeFieldValue will be converted into /// a string automatically. Note that you can't specify the return type of the field in the configuration file. /// </remarks> public string ReturnType { get; set; } /// <remarks> /// This method is what actually determines the value of the computed field. /// </remarks> public object ComputeFieldValue(IIndexable p_Indexable) { // Returning null means that the field won't be created. // By default, any returned value is automatically converted into a string. return null; } } }
-
Customize the class to meet your specific needs.
-
A computed field is processed for every Sitecore item that’s re-indexed. To minimize the impact on the duration of the indexing process
-
Filter out items that your computed field shouldn’t be added to.
-
Avoid doing HTTP requests.
-
Avoid querying a search index.
-
Ensure you optimize your code.
-
-
Since computed field logic runs in the context of Sitecore, you can take advantage of using the Sitecore API.
NoteThe
ReturnType
property should be set to the Sitecore data type of the value returned by the computed field. Ultimately, this value is converted to the corresponding Coveo data type. If you don’t set any return type, the value is automatically converted to a string, and therefore be of type String in the Coveo index. Here are the supported Sitecore data types along with their corresponding Coveo data types.Sitecore data type Coveo index data type Integer
Integer
Number
Floating point
date
Date/time
datetime
(Ensure theComputeFieldValue
method returns the datetime value inyyyy/MM/dd@HH:mm:ssZ
format.)Date/time
string
String
NoteTo access the built-in fields of the item being processed by the computed field, cast the
IIndexable
parameter of theComputeFieldValue
method toIIndexableBuiltinFields
. For example, do the following to access the template name:public object ComputeFieldValue(IIndexable p_Indexable) { IIndexableBuiltinFields fields = (IIndexableBuiltinFields)p_Indexable; string templateName = fields.TemplateName; ... }
-
-
Compile the project.
-
Copy the
Coveo.Custom.dll
to thebin
folder of your Sitecore instance (typically<SITECORE_INSTANCE_ROOT>\bin
or<SITECORE_INSTANCE_ROOT>\website\bin
).
Step 2: Add the computed field in the configuration
-
Open the
Coveo.SearchProvider.Custom.config
file in a text editor. This file is typically located in<SITECORE_INSTANCE_ROOT>\App_Config\Include\Coveo
or<SITECORE_INSTANCE_ROOT>\website\App_Config\Include\Coveo
. -
Locate the
<fields hint="raw:AddComputedIndexField">
element.<coveo> <defaultIndexConfiguration> <fieldMap> <fieldNames hint="raw:AddFieldByFieldName"> </fieldMap> <documentOptions> <!-- ... --> <fields hint="raw:AddComputedIndexField">
-
Add a new
<field>
element as an immediate child of the<fields hint="raw:AddComputedIndexField">
element.<field fieldName="mycoveofield">MyNamespace.ComputedFields.MyComputedField, MyNamespace.ComputedFields</field>
Replace the
fieldName
and XML element text values with the name you want for the Coveo index field, the proper full class name, and the assembly name.NoteThis configuration creates the computed field on indexing.
Don’t use special characters in computed field names.
-
(Optional) Locate the
<fieldNames hint="raw:AddFieldByFieldName">
element.<coveo> <defaultIndexConfiguration> <fieldMap> <fieldNames hint="raw:AddFieldByFieldName">
-
(Optional) Add a new
<fieldType>
element as an immediate child of the<fieldNames hint="raw:AddFieldByFieldName">
element.<fieldType fieldName="mycoveofield" isSortable="true" isFacet="true" settingType="Coveo.Framework.Configuration.FieldConfiguration, Coveo.Framework" returnType="System.String"/>
Replace the
fieldName
attribute value with the name you chose earlier for your Coveo index field. Replace thereturnType
attribute value with the appropriate value in the context.NoteThis configuration lets you specify special settings for the new field (for example, so that you may use the field as a facet or to sort search results).
Step 3: Rebuild your search indexes
Step 4: Validate the computed field has been added
Validate that your new field has been added on your items using the Content Browser (platform-ca | platform-eu | platform-au).
When running computed field code, check your logs for computed field errors indicating items aren’t being indexed. Implement proper exception handling to avoid these issues. For example, you might want to stop the process or set a fallback value for a computed field when suitable. |
Step 5: Use your new field
Use the new field in whatever way is needed. For example, you may want to display it in a result template.