Solr和产品SKU

时间:2012-05-06 22:41:13

标签: solr

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

如果我有ABC-DEF123G/5这样的SKU(仅作为示例),我希望用户能够使用或不使用标点符号进行搜索。在许多情况下,只有部分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,三个平台各有两个 - 一个用和   一个没有吉他控制器。

2 个答案:

答案 0 :(得分: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>

这是根据同事提供的默认版本的schema.xml改编的。

修改

通过改变边缘n-gram和缩短n-gram最小长度,进一步提高了相关性。

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

答案 1 :(得分:3)

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

如上所述定义您的sku字段,然后使用sku_stripped定义PatternReplaceFilterFactory

<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"/>