通过SolrNet提供非英语语言支持

时间:2012-05-08 06:39:45

标签: solr full-text-search solrnet

我正在使用SolrNet从.NET应用程序中搜索Solr。 当我搜索英语单词时,一切正常。但是,如果我 使用像 español 这样的西班牙语单词,虽然我没有搜索结果 已将它们编入索引。当我在Solr上调试时,我发现了查询 被解析为 espaA+ol

我是否必须进行一些UTF-8编码,或者SolrNet是否支持仅搜索ASCII字符?

2 个答案:

答案 0 :(得分:2)

这不是SolrNet问题,它与Solr如何处理不在前127个ASCII字符集中的字符有关。最好的建议是将ASCIIFoldingFilterFactory添加到您存储西班牙语单词的Solr字段。

例如,如果您使用的是Solr示例中定义的text_general fieldType,它在schema.xml文件中设置如下:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <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">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <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>

我建议将其修改如下,将ASCIIFoldingFilterFactory添加到索引和查询分析器。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <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"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <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"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
  </analyzer>
</fieldType>

另外,请注意,在更改架构后,您需要重新索引数据,以便将更改反映在索引中。

答案 1 :(得分:0)

不确定是否要在索引中专门保留这些字符?如果你不需要,最好使用像

这样的东西
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>

所以'español'会被索引为'espanol'并且搜索其中任何一个都会找到'español'(同样适用于á,ü等)。