我想使用 Solr + Sunspot 来索引双语 FR-EN 网站。问题:模型帖子可以用法语或英语编写。我可以在运行时确定语言是什么,但我还需要 Solr 相应地索引模型。
EG:对于法国模特,我需要一个法语词干分析器,
<filter class="solr.SnowballPorterFilterFactory" language="French"/>
我有哪些选择?我可以在运行时更改 Solr 分析器吗?我可以为每种语言制作一组分析器吗?
我想使用 Solr + Sunspot 来索引双语 FR-EN 网站。问题:模型帖子可以用法语或英语编写。我可以在运行时确定语言是什么,但我还需要 Solr 相应地索引模型。
EG:对于法国模特,我需要一个法语词干分析器,
<filter class="solr.SnowballPorterFilterFactory" language="French"/>
我有哪些选择?我可以在运行时更改 Solr 分析器吗?我可以为每种语言制作一组分析器吗?
这是一个很好的问题,并且正在讨论包含在 Sunspot 中的功能。
Sunspot 使用动态字段命名约定来设置其架构。例如,以下是文本字段的两个现有定义:
<dynamicField name="*_text" stored="false" type="text" multiValued="true" indexed="true"/>
<dynamicField name="*_texts" stored="true" type="text" multiValued="true" indexed="true"/>
这些对应fieldType name="text"
于模式中前面定义的。
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
您可以为要索引的不同语言添加类似的定义(正如 Mauricio 也提到的那样),然后设置一些新dynamicField
定义以使用它们。
fieldType
法语文本字段的定义<fieldType name="text_fr" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="French"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
dynamicField
法语文本字段的定义<dynamicField name="*_text_fr" stored="false" type="text" multiValued="true" indexed="true"/>
<dynamicField name="*_texts_fr" stored="true" type="text" multiValued="true" indexed="true"/>
最新的 Sunspot 1.2(尚未完全发布——使用 1.2.rc4)支持一个:as
选项,可以让您指定字段名称。
searchable do
text :description, :as => 'description_text_fr'
end
就像我说的,这是我正在考虑添加到 Sunspot 1.3 或 1.4 的内容。就个人而言,我希望看到类似于:lang => :en
文本字段定义的内容来选择适当的字段定义。请随时在 Sunspot 邮件列表中发表您的想法!
不能说太阳黑子,但在纯 Solr 中,我会在 Solr 模式中创建单独的字段类型(一个 fieldType 用于法语,另一个用于英语),然后为英语内容创建一个字段(使用英语 fieldType)和另一个字段对于法语内容(使用法语 fieldType)。
由于您知道在运行时使用哪种语言,您只需选择一个字段或另一个字段来运行搜索并获得结果。