Sunspot/rails 一个环境下的多核配置(针对不同语言的文档)Solr 5

Sunspot/rails configuration for multi-core (for different language docs) Solr 5 in one environment

我通过 Solr 5.1 为英语和日语文档创建了两个核心,我想知道如何设置 Sunspot/Rails 以根据我的 rails 区域设置 selection 选择一个核心应用

默认sunspot.yml显示了每个生产、开发和测试环境一个核心的设置,但在我的例子中,一个环境中有两个核心。

Sunspot是否可以在一个环境下处理多个内核?

使用URL,我可以通过不同的语言查询这些核心,如下所示,所以仍然根据用户的语言环境寻找select核心的配置。

服务器:port/solr/#/EN_core/query?q=text

服务器:port/solr/#/JP_core/query?q='テキスト'

我想出了如何在单个 Solr 实例中索引多语言文档,并通过 sunspot/rails 中的指定语言搜索索引文档。此方法使用不同的字段而不是针对不同语言的核心,因此它不是对我的问题的直接回答,而是 sunspot/solr/rails.

处理多语言文档的工作示例

例如index/search字段是Entry模型的“描述”。有些条目有英文说明,有些则有日文说明。我在 solr (https://cwiki.apache.org/confluence/display/solr/Detecting+Languages+During+Indexing) 和 copyField 的索引期间使用语言检测来处理 sunspot 的行为以将“_text”添加到可搜索字段。

  1. 通过rails迁移命令向Entry模型添加空字符串字段“descption_en”和“desctipion_jp”。听起来可能很奇怪,但这些空白字段使 sunspot 能够通过英语或日语搜索文档。这些命令可能如下所示,但是超过 1000 万条记录花费了相当多的时间。我应该在这里考虑其他方法 - https://www.onehub.com/blog/2009/09/15/adding-columns-to-large-mysql-tables-quickly/

     rails generate migration AddLanguageHolderToEntry description_en:string description_jp:string
     rake db:migrate
    
  2. 将可搜索添加到 Entry 模型

    class Entry < ActiveRecord::Base
       searchable do
          text :description, :description_en, :description_ja
       end
    end
    
  3. 配置solrconfig.xml以在索引期间启用 Solr 语言检测。

添加以下 updateRequestProcessorChain。在 langid.fl 中使用“description_text”而不是“描述”,因为 Sunspot 在字段名称中添加了“_text”。

 <updateRequestProcessorChain name="langid">
   <processor class="org.apache.solr.update.processor.LangDetectLanguageIdentifierUpdateProcessorFactory">
     <bool name="langid">true</bool>
     <str name="langid.fl">description_text</str>
     <str name="langid.whitelist">en,ja</str>
     <bool name="langid.map">true</bool>
     <str name="langid.langField">language</str>
     <str name="langid.fallback">en</str>
   </processor>
   <processor class="solr.LogUpdateProcessorFactory" />
   <processor class="solr.RunUpdateProcessorFactory" />
 </updateRequestProcessorChain>

我还在“/update”和“/update/extract”的requestHandlers中添加了langid如下。

<requestHandler name="/update" class="solr.UpdateRequestHandler">
 <lst name="defaults">
   <str name="update.chain">langid</str>
 </lst>
</requestHandler>

<requestHandler name="/update/extract"
startup="lazy"
class="solr.extraction.ExtractingRequestHandler" >
<lst name="defaults">
    <str name="lowernames">true</str>
    <str name="uprefix">ignored_</str>
    <str name="captureAttr">true</str>
    <str name="fmap.a">links</str>
    <str name="fmap.div">ignored_</str>
    <str name="update.chain">langid</str>
</lst>
</requestHandler>

检查库的路径

  <lib dir="/path to/contrib/langid/lib/" regex=".*\.jar" />
  <lib dir="/path to/dist/" regex="solr-langid-\d.*\.jar" />
  1. 配置schema.xml

为“描述”添加字段。 “_text_en”和“_text_jp”用于 solr 语言检测的输出。太阳黑子 indexing/searching 的“_en_text”和“_jp_text”。

   <field name="name_text_en" type="text_en" indexed="false" stored="true"/>
   <field name="name_en_text" type="text_en" indexed="true" stored="false"/>

   <field name="name_text_ja" type="text_ja" indexed="false" stored="true"/>
   <field name="name_ja_text" type="text_ja" indexed="true" stored="false"/>

对于检测到的语言。

这些复制字段是为搜索而设置的。

<copyField source="description_text_en" dest="description_en_text" />
<copyField source="description_text_ja" dest="description_ja_text" />

schema.xml 中需要“text_en”和“text_ja”字段类型。我在这里省略了它们的详细配置,但使用标准分析器。

<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">.....
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">.....
  1. 从太阳黑子建立索引

    bundle exec rake sunspot:reindex
    
  2. 搜索文档 – 测试。

    rails console
    

对于英文文档 -

@search =  Entry.search do
   fulltext 'keyword_en' do
     fields(:description_en)
   end
end

对于日语文档 -

@search =  Entry.search do
   fulltext 'キーワード' do
     fields(:description_ja)
   end
end

@search.results

如您所见,这是一种临时方法,欢迎对它提出任何意见。