2

我正在使用 UAX29URLEmailTokenizerFactory 标记器在 SOLR 中索引一些 URI。问题是我的一些 URI 包含加号字符,SOLR 将其解释为空格并拆分 URI。这个问题可以通过巧妙地转义“+”字符来解决吗?我在分析器中尝试了“+”,但得到了相同的结果。这是我对字段的确切配置:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
4

2 回答 2

4

您可以在分析器之前使用 CharacterFilter(例如 PatternReplaceCharFilterFactory)。这个链接有一些很好的信息。我能想到的一种解决方案是将 + 字符替换为其他字符 - 然后当您提供此链接时,请记住将其替换回来。

另一个要研究的是,用加号(%2B)的 URL 编码值替换它,看看分析器是否将其视为空格。

于 2012-06-14T13:27:51.140 回答
1

我想出的解决方案最终使用了上面建议的 CharacterFilter。诀窍是用编码的字符“%2B”替换它。这具有将 URI 保留为单个令牌并以正确状态将其返回到我的应用程序的效果 - 作为“+”。这是我想出的字段类型定义:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/>
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/>
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
于 2012-06-15T06:51:00.760 回答