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