Конфигурация Sunspot/rails для многоядерных (для документов на разных языках) Solr 5 в одной среде

Я создаю два ядра для документов на английском и японском языках с помощью Solr 5.1, и мне интересно, как настроить Sunspot/Rails для выбора ядра в зависимости от выбора локали в моем приложении rails.

В файле sunspot.yml по умолчанию указано одно ядро ​​для каждой рабочей среды, среды разработки и тестирования, но в моем случае в одной среде два ядра.

Можно ли с помощью Sunspot обрабатывать несколько ядер в одной среде?

Используя URL-адрес, я могу запрашивать эти ядра на разных языках, как показано ниже, поэтому по-прежнему ищите конфигурацию для выбора ядра по языковому стандарту пользователя.

сервер: порт/solr/#/EN_core/query?q=текст

сервер:порт/solr/#/JP_core/query?q='テキスト'


person makio    schedule 10.05.2015    source источник
comment
Похоже, переход на Elasticsearch предлагает решение – groups.google.com/forum/#!searchin/ruby-sunspot/   -  person makio    schedule 12.05.2015


Ответы (1)


Я выясняю, как индексировать многоязычные документы в одном экземпляре Solr и искать проиндексированные документы по указанному языку из sunspot/rails. Этот метод использует разные поля вместо ядер для разных языков, поэтому это не прямой ответ на мой вопрос, а рабочий пример для работы с многоязычными документами с помощью sunspot/solr/rails.

Например, поле индекса/поиска — это «описание» модели Entry. Некоторые записи имеют описания на английском языке, а другие — на японском. Я использую определение языка во время индексации solr (https://cwiki.apache.org/confluence/display/solr/Detecting+Languages+During+Indexing) и copyField для обработки поведения солнечных пятен, чтобы добавить «_text» в доступные для поиска поля.

  1. Добавьте пустые строковые поля «descption_en» и «descipion_jp» в модель Entry с помощью команд миграции rails. Может показаться странным, но эти пустые поля позволяют sunspot искать документы на английском или японском языках. Команды могут быть такими, как показано ниже, но это заняло довольно много времени для> 10 миллионов записей. Здесь я должен рассмотреть другие методы - 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. Использование «description_text» в langid.fl вместо «description», потому что 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>

Я также добавил langid в обработчики запросов «/update» и «/update/extract» следующим образом.

<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. «_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" />

Нужны типы полей «text_en» и «text_ja» в schema.xml. Я опускаю здесь детали их настройки, а использую стандартные анализаторы.

<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

@результаты поиска

Как вы видите, это специальный метод, и приветствуются любые комментарии по нему.

person makio    schedule 23.05.2015