Solr/Sunspot - 在运行时确定索引语言,动态选择分析器

Vla*_*anu 7 solr full-text-search ruby-on-rails internationalization sunspot

我想使用Solr + Sunspot来索引双语FR-EN网站.问题:模特邮政可以用法语或英语写成.我可以在运行时确定语言是什么,但我也需要Solr来相应地索引模型.

EG:对于法国模特,我需要一个法国干手,

<filter class="solr.SnowballPorterFilterFactory" language="French"/>
Run Code Online (Sandbox Code Playgroud)

我有什么选择?我可以在运行时更改Solr分析仪吗?我可以为每种语言制作一套分析仪吗?

Nic*_*zny 10

这是一个很好的问题,正在讨论包含在太阳黑子中的一个特征.

Sunspot使用动态字段命名约定来设置其架构.例如,以下是文本字段的两个现有定义:

<dynamicField name="*_text" stored="false" type="text" multiValued="true" indexed="true"/>
<dynamicField name="*_texts" stored="true" type="text" multiValued="true" indexed="true"/>
Run Code Online (Sandbox Code Playgroud)

这些对应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>
Run Code Online (Sandbox Code Playgroud)

您可以为您要索引的不同语言添加类似的定义(如Mauricio所述),然后设置一些新dynamicField定义以使用它们.

1. 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>
Run Code Online (Sandbox Code Playgroud)

2. 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"/>
Run Code Online (Sandbox Code Playgroud)

3.使用太阳黑子中的法语文本字段

最新的Sunspot 1.2(尚未发布 - 使用1.2.rc4)支持一个:as允许您指定字段名称的选项.

searchable do
  text :description, :as => 'description_text_fr'
end
Run Code Online (Sandbox Code Playgroud)

就像我说的,这是我想要添加到太阳黑子1.3或1.4的东西.就个人而言,我希望看到类似于:lang => :en文本字段定义的内容来选择适当的字段定义.您可以随意在Sunspot邮件列表中加入您的想法!