In Sitecore, there is no dynamic field for float
collection in Solr managed schema. You can add it by taking the following steps.
① Add the following packages to your Visual Studio project.
- Sitecore.ContentSearch.dll
- Sitecore.ContentSearch.SolrProvider.dll
- SolrNet.Core.dll
② Create a class inherit from the SchemaPopulateHelper
, and override the GetAllFields
method.
public class ExtendedSchemaPopulateHelper : SchemaPopulateHelper { public ExtendedSchemaPopulateHelper(SolrSchema solrSchema) : base(solrSchema) { } public override IEnumerable<XElement> GetAllFields() { // definition of a dynamic field var floatCollectionField = new XElement("add-dynamic-field", new XElement("name", "*_fm"), new XElement("type", "pfloat"), new XElement("indexed", "true"), new XElement("stored", "true"), new XElement("multiValued", "true")); /* NOTE: You can use this.CreateField instead if you use Sitecore 9.3. var floatCollectionField = this.CreateField( name: "*_fm", type: "pfloat", required: false, indexed: true, stored: true, multiValued: true, omitNorms: false, termVectors: false, termPositions: false, termOffsets: false, isDynamic: true); */ return base.GetAllFields().Append(floatCollectionField); } }
③ Create a class inherit from the PopulateFields
, and override the GetHelper
method.
public class ExtendedPopulateFields : PopulateFields { protected override ISchemaPopulateHelper GetHelper(SolrSchema schema) { // return a customized helper instance return new ExtendedSchemaPopulateHelper(schema); } }
④ Replace the default processor to a customized one by configuration.
<?xml version="1.0" encoding="utf-8" ?> <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:search="http://www.sitecore.net/xmlconfig/search/"> <sitecore role:require="Standalone or ContentManagement or ContentDelivery" search:require="solr"> <pipelines> <contentSearch.PopulateSolrSchema> <processor type="NamespaceTo.ExtendedPopulateFields, Assembly" patch:instead="*[@type='Sitecore.ContentSearch.SolrProvider.Pipelines.PopulateSolrSchema.PopulateFields, Sitecore.ContentSearch.SolrProvider']" /> </contentSearch.PopulateSolrSchema> </pipelines> </sitecore> </configuration>
⑤ Populate the Solr schema in the Control Panel.
Then, check your Solr schema in <solr>/server/solr/<core>/conf/managed-schema
. You can find a definition of the dynamic field.
<dynamicField name="*_tf" type="pfloat" indexed="true" stored="true"/> <dynamicField name="*_td" type="pdouble" indexed="true" stored="true"/> <dynamicField name="*_pi" type="pint" indexed="true" stored="true"/> <!-- *_fm should be added here --> <dynamicField name="*_fm" type="pfloat" multiValued="true" indexed="true" stored="true"/> <dynamicField name="*_t" type="text_general" indexed="true" stored="true"/> <dynamicField name="*_i" type="pint" indexed="true" stored="true"/>
If you want to map your (Sitecore's) field to this dynamic field, you have to configure field mapping like below. (it's just a sample)
<?xml version="1.0" encoding="utf-8" ?> <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:search="http://www.sitecore.net/xmlconfig/search/"> <sitecore role:require="Standalone or ContentManagement or ContentDelivery" search:require="solr"> <contentSearch> <indexConfigurations> <defaultSolrIndexConfiguration type="Sitecore.ContentSearch.SolrProvider.SolrIndexConfiguration, Sitecore.ContentSearch.SolrProvider"> <fieldMap type="Sitecore.ContentSearch.SolrProvider.SolrFieldMap, Sitecore.ContentSearch.SolrProvider"> <typeMatches hint="raw:AddTypeMatch"> <!-- Add a typeMatch --> <typeMatch typeName="floatCollection" type="System.Collections.Generic.List`1[System.Single]" fieldNameFormat="{0}_fm" multiValued="true" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider" /> </typeMatches> <fieldTypes hint="raw:AddFieldByFieldTypeName"> <!-- Map your field (lowercase) to floatCollection --> <fieldType fieldTypeName="float list" returnType="floatCollection" /> </fieldTypes> </fieldMap> <fieldReaders type="Sitecore.ContentSearch.FieldReaders.FieldReaderMap, Sitecore.ContentSearch"> <param desc="id">defaultFieldReaderMap</param> <mapFieldByTypeName hint="raw:AddFieldReaderByFieldTypeName"> <!-- Implement a field reader and configure for float list --> <fieldReader fieldTypeName="float list" fieldReaderType="NamespaceTo.FloatListFieldReader, Assembly" /> </mapFieldByTypeName> </fieldReaders> </defaultSolrIndexConfiguration> </indexConfigurations> </contentSearch> </sitecore> </configuration>
I hope this post helps your Sitecore life.
Top comments (0)