2012-05-06 32 views
3

我正在为我的产品SKU编写自定义文本字段类型。Solr和产品SKU

如果我有一个SKU,如ABC-DEF123G/5(只是一个示例),我希望用户能够使用或不使用标点进行搜索。在许多情况下,只有部分SKU是相关的,例如, ABC-DEF123在我的例子。

到目前为止,我有我的schema.xml看起来像:

<fieldType name="sku" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.WordDelimiterFilterFactory" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      stemEnglishPossessive="0" 
      catenateAll="1" 
     /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/> 
    </analyzer> 
</fieldType> 

<!-- For use in Sunspot: --> 
<dynamicField name="*_sku" stored="false" type="sku" multiValued="true" indexed="true"/> 

这个效果很好,我可以搜索一个SKU,例如部分地区DEF123并得到一个合适的结果(感谢ngram过滤器)。但是,没有标点分隔符的搜索不会返回任何匹配:ABC-DEF123G/5很好,但是ABCDEF123G5不是。

当我对我的模式进行分析时,我发现搜索ABCDEF123G5突出显示了匹配项,但运行实际查询时没有返回结果。

我重新启动了Solr并重新编制了我的文档。多次。

索引SKU或类似的任何智慧珍珠?


这个编辑器(aitchnyu)添加了这个来自维基百科:

一个库存单位或SKU是用于标识销售的每 独特的产品或项目在商店的数字或代码或其他业务。

它是可以购买 的每种不同产品和服务的唯一标识符。 SKU的使用植根于数据管理,使公司能够系统地跟踪其库存或产品可用性,例如仓库和零售店。他们通常在商户级别分配并序列化为 。每个SKU附加到 项目,变体,产品系列,捆绑包,服务,费用或附件。 SKU通常用于指产品的不同版本。举例来说,一个零售商店的吉他英雄3 可能有六个SKU,两个三个平台的每一个 - 一个没有吉他控制器和 。

回答

4

后的这个周期性玩弄了几天,我最后终于决定如下:

<fieldType name="sku" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15"/> 
    </analyzer> 
</fieldType> 

这已从默认的模式版本改编而来。xml由一位同事提供。

编辑:

关联通过改变到边缘的n-gram和通过缩短n-gram中的最小长度进一步提高。

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>

3

您可以使用具有两种不同字段类型的copyField,例如, skusku_stripped

定义你的sku场,你有以上,然后用PatternReplaceFilterFactory定义sku_stripped

<fieldType name="sku_stripped" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
     <filter class="solr.PatternReplaceFilterFactory" 
      pattern="[^A-Za-z0-9]" 
      replacement="" 
      replace="all"/> 
     <!-- same as above ... --> 
    </analyzer> 
</fieldType> 

然后copyField:

<fields> 
    <!-- ... --> 
    <field name="stripped_sku_field" type="sku_stripped" 
     indexed="true" stored="false" multiValued="true" omitNorms="true"/> 
    <!-- ... --> 
</fields> 
<copyField source="*_sku" dest="stripped_sku_field"/>