0

我遇到了 apachesolr 的搜索问题。

例如我索引的内容是:

  • 提拉米苏 d'hiver
  • Velouté d'hiver
  • Minestrone d'hiver crémeux,
  • 冰沙版蜂巢

当我搜索“hiver”时,我只得到 Smoothie 版本的 hiver 作为结果。

当我搜索 dhiver 时,我得到了结果

  • 提拉米苏 d'hiver
  • Velouté d'hiver
  • Minestrone d'hiver crémeux

无论我搜索 hiver 或 dhiver 还是 dhiver,我都需要获得所有结果

有人知道有什么问题吗?我是否必须更改我的 schema.xml 中的某些内容?

我的文本字段架构是:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            />
    <filter class="solr.WordDelimiterFilterFactory" 
          generateWordParts="1" 
          generateNumberParts="1"
          catenateWords="1"
          catenateNumbers="1"
          catenateAll="0"
          splitOnCaseChange="1"
          splitOnNumerics="1"
          preserveOriginal="1"
    />
    <filter class="solr.LengthFilterFactory" min="3" max="100" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="5"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>

  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            />
    <filter class="solr.WordDelimiterFilterFactory" 
          generateWordParts="1" 
          generateNumberParts="1"
          catenateWords="1"
          catenateNumbers="0"
          catenateAll="0"
          splitOnCaseChange="1"
          splitOnNumerics="1"
    />
    <filter class="solr.LengthFilterFactory" min="3" max="100" />
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>

  </analyzer>

  <analyzer type="multiterm">
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            />
    <filter class="solr.WordDelimiterFilterFactory"
            protected="protwords.txt"
            generateWordParts="1"
            generateNumberParts="1"
            catenateWords="0"
            catenateNumbers="0"
            catenateAll="0"
            splitOnCaseChange="1"
            preserveOriginal="1"/>
    <filter class="solr.LengthFilterFactory" min="2" max="100" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>
4

1 回答 1

1

嗯好吃。

首先,对于所有这些类型的问题,使用 Solr 分析工具是您的朋友。其次,请记住 Solr 仅在查询和术语 100% 字符与字符相同时才匹配。

对于以下过滤器

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />

Velouté d'hiver 将被分析为

丝绒 | 希弗| d | 潜水员 | 蜂巢

所以将匹配您对 hiver 的查询 - 您可能想要删除 | d | 我的过滤器生成的令牌。

记得在某处也折叠重音字符。

于 2017-01-23T08:59:14.053 回答