2012-05-06 91 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"/> 
相關問題