【问题标题】:Index plus character in SOLRSOLR中的索引加字符
【发布时间】:2012-06-14 12:29:28
【问题描述】:

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

【问题讨论】:

    标签: solr escaping character uri


    【解决方案1】:

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

    另外要研究的是,用加号(%2B)的URL编码值替换它,看看分析器是否把它当作空格。

    【讨论】:

    • 感谢您的想法,用转义的 '%2B' 代替 '+' 字符效果很好
    【解决方案2】:

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

    【讨论】:

    • 我试过了,但由于某种原因,只有索引有效。查询始终作为 %2B0876xxxx 传递,但仅在它是 %252B0876xxxx 时才匹配。如果您想知道, %25 似乎是百分比转义序列。我还没有找到任何方法来正确替换 + 以便在搜索 URL 中得到尊重。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多