Sitecore 9索引:Solr模式标记器不起作用

时间:2018-09-24 02:50:30

标签: solr sitecore

我对sitecore和solr的组合非常陌生。.模式标记生成器有一个小问题,它无法正常工作。.我正在关注本文档

  

Solr:   https://lucene.apache.org/solr/guide/6_6/tokenizers.html#Tokenizers-RegularExpressionPatternTokenizer

     

Sitecore 9 Solr:   https://doc.sitecore.net/sitecore_experience_platform/setting_up_and_maintaining/search_and_indexing/using_solr_field_name_resolution

当我进行索引时,我的字段值为:a,b,c,我预计在solr上将为[“ a”,“ b”,“ c”],但其中包含[“ a,b,c “]

这是我的Sitecore配置

<fieldMap>
   <typeMatches hint="raw:AddTypeMatch">
      <typeMatch type="System.Collections.Generic.List`1[System.String]" typeName="commaDelimitedCollection" fieldNameFormat="{0}_cd" 
         multiValued="true" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider"/>
   </typeMatches>
   <fieldNames hint="raw:AddFieldByFieldName">
      <field fieldName="Keywords" returnType="commaDelimitedCollection"/>
   </fieldNames>
</fieldMap> 

这是我的Solr模式

<fieldType name="commaDelimited" class="solr.TextField" multiValued="true">
    <analyzer>
      <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
    </analyzer>
  </fieldType>

<dynamicField name="*_cd" type="commaDelimited" multiValued="true" indexed="true" stored="true"/>

您知道上面的配置有什么问题吗?

谢谢

1 个答案:

答案 0 :(得分:1)

不确定我是否能在这里看到完整图片。也许您的方法是完全正确的,但我认为我以前从未见过这种方法。您可以重用*_sm(多值字符串)并在Sitecore端的索引时间执行字符串拆分,而不是定义新的类型。通常,您不需要比sitecore提供的字段类型更多的字段类型,并且通常更容易维护VS解决方案中的所有代码,而不是依赖于其他Solr配置。 (不过,在Sitecore 9中,您可以从控制面板部署Solr托管模式。)

一个简单的计算字段字段可能看起来像这样:

<fields hint="raw:AddComputedIndexField">
  <field fieldName="keywords" returnType="stringCollection">
    Your.Name.Space.YourComputedFieldClass, YourAssembly
  </field>
</fields>

一个类的实现可能看起来像这样:

public class YourComputedFieldClass : IComputedIndexField
{
  public object ComputeFieldValue(IIndexable indexable)
  {
    var item = indexable as SitecoreIndexableItem;
    var fieldValue = item?.Item?["Keywords"]
    if (string.IsNullOrWhitespace(fieldValue)) {
      return null;
    }
    return fieldValue.Split(',');
  }

  public string FieldName { get; set; }

  public string ReturnType { get; set; }
}