Solr 搜索 T 恤 returns 衬衫

Solr search t-shirt returns shirt

当我在我的 solr 上搜索 T 恤时,首先是 returns 衬衫。 我的字段配置如下:

    <fieldType name="my_test" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
      <analyzer type="index">        
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" splitOnNumerics="1" preserveOriginal="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" maxGramSize="20" minGramSize="2"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
      <analyzer type="query">        
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" splitOnNumerics="1" preserveOriginal="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
    </fieldType>

你看到什么优化点了吗? 谢谢

在这里,您正在为您的字段使用 StandardTokenizerFactory,它正在创建一个令牌作为衬衫,因此匹配。

StandardTokenizerFactory :- 它对空格进行标记,并去除字符

StandardTokenizerFactory 的文档提到:-

Splits words at punctuation characters, removing punctuations. However, a dot that's not followed by whitespace is considered part of a token. Splits words at hyphens, unless there's a number in the token. In that case, the whole token is interpreted as a product number and is not split. Recognizes email addresses and Internet hostnames as one token.

如果要对“t-shirt”执行搜索,则应将其标记化。 我建议您使用 KeywordTokenizerFactory

Keyword Tokenizer 不会拆分提供给它的输入。 它不对字符串做任何处理,整个字符串被视为单个标记。 这实际上并没有做任何标记化。它returns原文为一个术语

这个KeywordTokenizerFactory用于排序或者分面需求,需要精确匹配。它有助于分面和排序。

您可以有另一个字段并对其应用 KeywordTokenizerFactory 并对其执行搜索。

我使用 solr.WhitespaceTokenizerFactory 而不是 solr.StandardTokenizerFactory

解决了这个问题