3

我正在为我的产品 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

2 回答 2

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

于 2012-05-16T02:10:12.453 回答
3

您可以将 acopyField与两种不同的字段类型一起使用,例如skusku_stripped

像上面一样定义您的sku字段,然后sku_stripped使用 a定义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"/>
于 2012-05-07T09:51:45.683 回答