1

我正在使用 SolrNet 从 .NET 应用程序中搜索 Solr。当我搜索英文单词时,一切正常。但是,如果我使用诸如 之类的西班牙语单词español,尽管我已将它们编入索引,但我没有得到任何搜索结果。当我通过 Solr 进行调试时,我发现查询被解析为espaA+ol.

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

4

2 回答 2

2

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

例如,如果您使用text_generalSolr 示例中定义的 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>

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

于 2012-05-08T12:43:28.710 回答
0

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

<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>

所以“español”将被索引为“espanol”,搜索其中任何一个都会找到“español”(á,ü等相同)。

于 2012-05-08T08:39:16.110 回答