配置 solr 以匹配标点符号,例如'tshirt' 匹配 't-shirt'

Configuring solr to match over punctuation, e.g. 'tshirt' matches 't-shirt'

我正在使用 Solr 为服装网站上的产品编制索引。目前,我正在尝试让 Solr 根据搜索词 tshirt 匹配 t-shirt,但我有点不知道我需要什么过滤器。

这是我目前用于索引大多数字段的通用字段类型:

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/>
  </analyzer>
</fieldType>

我尝试从索引和查询分析器中删除 WordDelimiterFilterFactory,但没有帮助。任何 advice/best 实践将不胜感激。

您会希望 WordDelimiterFilter 更靠近您的链,并且您会希望改用 Whitespace Tokenizer。 wiki 上的示例就是这样做的。

现在的问题是标记在早些时候被拆分成单独的标记,而 worddelimeterfilter 只能单独看到每个标记。所以它看到了 t,然后是 shirt,实际上没有任何事情要做。

通过使用空白分词器,您可以让 WDF 看到 "t-shirt",允许它生成 t、shirt、tshirt 等。

使用 Solr Admin 下的 "Analysis" 页面查看分析中的每个步骤以及结果。