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”添加到可搜索字段。
通过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
将可搜索添加到 Entry 模型
class Entry < ActiveRecord::Base
searchable do
text :description, :description_en, :description_ja
end
end
配置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" />
- 配置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">.....
从太阳黑子建立索引
bundle exec rake sunspot:reindex
搜索文档 – 测试。
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
如您所见,这是一种临时方法,欢迎对它提出任何意见。
我通过 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”添加到可搜索字段。
通过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
将可搜索添加到 Entry 模型
class Entry < ActiveRecord::Base searchable do text :description, :description_en, :description_ja end end
配置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" />
- 配置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">.....
从太阳黑子建立索引
bundle exec rake sunspot:reindex
搜索文档 – 测试。
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
如您所见,这是一种临时方法,欢迎对它提出任何意见。