【问题标题】:Solr accent removalSolr 重音去除
【发布时间】:2013-06-18 06:43:41
【问题描述】:

我已经阅读了有关如何在索引/查询期间删除重音的各种主题。我想出的当前字段类型如下所示:

<fieldType name="text_general" class="solr.TextField">     
    <analyzer>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>     
</fieldType>

在索引中添加了一些测试信息后,我通过http://localhost:8080/solr/test_core/admin/luke?fl=title检查了

生成了哪种令牌。 例如,像“Bayern München”这样的标题已被标记为:

<int name="bayern">1</int>
<int name="m">1</int>
<int name="nchen">1</int>

因此,它没有用它的 ascii 挂件替换字符,而是被解释为一个分隔符?!有了这样的索引结果,我既不能搜索“münchen”,也不能搜索 m?nchen。

知道如何解决吗? 提前致谢。

【问题讨论】:

    标签: search solr non-ascii-characters


    【解决方案1】:

    问题是您在应用ASCIIFoldingFilterFactory 之前应用StandardTokenizerFactory。相反,您应该首先使用MappingCharFilterFactory 字符过滤器工厂和StandardTokenizerFactory

    根据Solr Reference guide StandardTokenizerFactory 支持&lt;ALPHANUM&gt;, &lt;NUM&gt;, &lt;SOUTHEAST_ASIAN&gt;, &lt;IDEOGRAPHIC&gt;, and &lt;HIRAGANA&gt;。因此,当您使用StandardTokenizerFactory 进行标记化时,变音符号会丢失,之后您的ASCIIFoldingFilterFactory 将毫无用处。

    如果您想选择StandardTokenizerFactory,您的fieldType 应该如下所示。

    <fieldType name="text_general" class="solr.TextField">     
        <analyzer>
                <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
                <tokenizer class="solr.StandardTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>     
    </fieldType>
    

    mapping-ISOLatin1Accent.txt 应该具有此类“特殊”字符的映射。在 Solr 中,默认情况下会预先填充此文件。例如ü -&gt; ueä -&gt; ae

    【讨论】:

    • 感谢您的回答。但是 MappingCharFilterFactory 似乎没有被应用。我确实通过 post.jar 发送一个包含要添加到索引的内容的 json 文件来更新索引。由于我已将 Standardtokenizer 替换为 WhitespaceTokenizerFactory,因此字符串不会根据重音符号进行标记,但也不会被 mapping-ISOLatin1Accent.txt 的内容替换。
    • 如果您使用的是 WhitespaceTokenizerFactory,那么您可以使用 ASCIIFoldingFilterFactory。就像您在问题中遇到的 fieldType 一样,只需将 StandardTokenizerFactory 替换为 WhitespaceTokenizerFactory。
    • 我确实已经为标题字段和 content_type 字段应用了不同的字段类型,一方面有 MappingCharFilterFactory,另一方面有 ASCIIFoldingFilter。两种变体仍然不起作用。 localhost:8080/solr/test_core/admin/luke?fl=title,content_type 1 在 content_type 字段和 1 用于标题字段(具有小写过滤器)
    • 我猜到了,它失败是因为通过 post.jar 更新索引,没有适当的编码。这就是为什么我添加了 Dfile.encoding 参数。然而还没有解决问题。 java -Durl=localhost:8080/solr/test_core/update -Dtype=application/json -Dfile.encoding=UTF-8 -jar post.jar *.json
    猜你喜欢
    • 2012-10-15
    • 2012-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2015-07-10
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多