索引加上SOLR中的字符

时间:2012-06-14 12:29:29

标签: solr escaping character uri

我使用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>

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我想出的解决方案最终使用了上面建议的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>