我正在使用 SolrNet 从 .NET 应用程序中搜索 Solr。当我搜索英文单词时,一切正常。但是,如果我使用诸如 之类的西班牙语单词español
,尽管我已将它们编入索引,但我没有得到任何搜索结果。当我通过 Solr 进行调试时,我发现查询被解析为espaA+ol
.
我是否必须进行一些 UTF-8 编码,或者 SolrNet 是否支持仅搜索 ASCII 字符?
我正在使用 SolrNet 从 .NET 应用程序中搜索 Solr。当我搜索英文单词时,一切正常。但是,如果我使用诸如 之类的西班牙语单词español
,尽管我已将它们编入索引,但我没有得到任何搜索结果。当我通过 Solr 进行调试时,我发现查询被解析为espaA+ol
.
我是否必须进行一些 UTF-8 编码,或者 SolrNet 是否支持仅搜索 ASCII 字符?
这不是 SolrNet 问题,它与 Solr 如何处理不在前 127 个 ASCII 字符集中的字符有关。最好的建议是将ASCIIFoldingFilterFactory添加到存储西班牙语单词的 Solr 字段中。
例如,如果您使用text_general
Solr 示例中定义的 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>
此外,请注意,在进行此架构更改后,您需要重新索引您的数据,以便将更改反映在索引中。
不确定是否要专门将这些字符保留在索引中?如果你不需要,最好使用类似的东西
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
所以“español”将被索引为“espanol”,搜索其中任何一个都会找到“español”(á,ü等相同)。