0

我的 SOLR 配置中有以下字段:

<fieldType name="title" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" preserveOriginal="1" catenateAll="1" splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

在我可以存储的字段内:

蜘蛛侠,蜘蛛侠,蜘蛛侠

我想要的是搜索蜘蛛侠获得所有 3 个选项的人,理想情况下搜索蜘蛛侠获得所有 3 个选项的人。除了在索引时修改内容之外,还有另一种方法可以有效地忽略特殊字符,但不一定要对其进行拆分?

4

2 回答 2

-1

一种可能的解决方案,特别是如果分隔符的数量很少,是通过solr.PatternReplaceFilterFactory如下方式替换它们:

<fieldType name="title" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.KeywordTokenizerFactory"/>
                <filter class="solr.PatternReplaceFilterFactory" pattern="-" replacement=""/>
                <filter class="solr.PatternReplaceFilterFactory" pattern=" " replacement=""/>
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.KeywordTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
        </fieldType>

如果关键字标记器是一个不好的选择,因为它会保留一个标记(对于标题这样的字段可能没问题),您可以创建自己的标记器,它将仅在需要的符号上拆分标题或添加额外的过滤器,如 ngram 以允许标题字段上的部分匹配。

于 2017-01-13T10:58:06.410 回答
-1

我知道这是一篇旧帖子,但这里的正确答案是您应该将“蜘蛛侠,蜘蛛侠,蜘蛛侠”添加到您的 synonyms.txt 文件中并重新启动 solr。如果这仍然不起作用,请确保您的架构使用 SynonymGraphFilterFactory 分析器。你在这里描述的是同义词。

于 2018-10-09T18:56:33.797 回答