我想使用Solr + Sunspot来索引双语FR-EN网站。问题:模特邮政可以用法语或英语写成。我可以在运行时确定语言是什么,但我也需要Solr来相应地索引模型。
EG:对于法国模特,我需要一个法国词干,<filter class="solr.SnowballPorterFilterFactory" language="French"/>
我有什么选择?我可以在运行时更改Solr分析仪吗?我可以为每种语言制作一套分析仪吗?
答案 0 :(得分:10)
这是一个很好的问题,正在讨论包含在太阳黑子中的一个特征。
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
就像我说的,这是我想要添加到太阳黑子1.3或1.4中的东西。就个人而言,我希望在文本字段定义上看到类似:lang => :en
的内容,以选择适当的字段定义。您可以随意在Sunspot邮件列表中加入您的想法!
答案 1 :(得分:2)
不能说Sunspot,但在纯Solr中,我会在你的Solr模式中创建单独的字段类型(一个fieldType用于法语,另一个用于英语),然后为英语内容创建一个字段(使用英语fieldType)和法语内容的另一个字段(使用法语fieldType)。
由于您知道在运行时使用哪种语言,因此您只需选择一个字段或另一个字段来运行搜索并获得结果。