使用Solr处理变音符号和重音符号

时间:2012-11-20 12:32:11

标签: solr indexing ascii diacritics

我们使用Solr 3.6来索引文档集合(DBLP)。一些文件的元数据是德文的。为了处理变音符号和重音符号,我们使用ASCIIFoldingFilterFactory(参见schema.xml)。

在搜索title:Unterstutzung时,会返回多个结果,但在搜索title:Unterstützung时,即使文档的标题字段中包含Unterstützung,也没有结果。

在管理Web界面中使用分析器显示查询术语和文档术语已按预期编制索引和处理。但是,当查询中有变音符号时,为什么我们没有得到任何结果?

schema.xml中标题字段的定义:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
                    <analyzer type="index">
                            <charFilter class="solr.HTMLStripCharFilterFactory"/>
                            <tokenizer class="solr.StandardTokenizerFactory"/>
                            <filter class="solr.ASCIIFoldingFilterFactory"/>
                            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1" preserveOriginal="1"/>
                            <filter class="solr.LowerCaseFilterFactory"/>
                            <filter class="solr.EnglishPorterFilterFactory"/>
                            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
                    </analyzer>
                    <analyzer type="query">
                            <tokenizer class="solr.StandardTokenizerFactory"/>
                            <filter class="solr.ASCIIFoldingFilterFactory"/>
                            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1"/>
                            <filter class="solr.LowerCaseFilterFactory"/>
                            <filter class="solr.EnglishPorterFilterFactory"/>
                            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
                    </analyzer>
            </fieldType>

完整schema.xml:http://pastebin.com/rQDw30nA

文件和查询中Unterstützung的分析器输出:http://pastebin.com/6cxSnGwP(在查询中,处理后的术语 unterstutzung 突出显示)

2 个答案:

答案 0 :(得分:3)

Tomcat是一个简单的编码问题。必须将以下属性添加到server.xml:

<Server ...>
 <Service ...>
   <Connector ... URIEncoding="UTF-8"/>
     ...
   </Connector>
 </Service>
</Server>

http://wiki.apache.org/solr/SolrTomcat#URI_Charset_Config

答案 1 :(得分:1)

一年前我和Solr 1.4有类似的问题,我不太确定它是否适合你,但使用映射过滤器可以帮助你,除了ascii折叠,还有相关的部分来自我的架构

 <analyzer type="index">^M
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>^M
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>^M
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>^M
    <filter class="solr.LowerCaseFilterFactory"/>^M
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>^M
</analyzer>^M
<analyzer type="query">
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
     <tokenizer class="solr.WhitespaceTokenizerFactory"/>
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.WhitespaceTokenizerFactory"/>
     <filter class="solr.ASCIIFoldingFilterFactory"/>
         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
         <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
 </analyzer>

映射文件只是一个像'unicode' => 'Mapped char'这样的mappins的文本文件,你可以根据google上的语言找到很多例子......

我希望它有所帮助