Я выясняю, как индексировать многоязычные документы в одном экземпляре Solr и искать проиндексированные документы по указанному языку из sunspot/rails. Этот метод использует разные поля вместо ядер для разных языков, поэтому это не прямой ответ на мой вопрос, а рабочий пример для работы с многоязычными документами с помощью sunspot/solr/rails.
Например, поле индекса/поиска — это «описание» модели Entry. Некоторые записи имеют описания на английском языке, а другие — на японском. Я использую определение языка во время индексации solr (https://cwiki.apache.org/confluence/display/solr/Detecting+Languages+During+Indexing) и copyField для обработки поведения солнечных пятен, чтобы добавить «_text» в доступные для поиска поля.
Добавьте пустые строковые поля «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
Добавить возможность поиска в модель Entry
class Entry < ActiveRecord::Base
searchable do
text :description, :description_en, :description_ja
end
end
Настройте 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" />
- Настроить файл 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">.....
Сделать индексацию от солнечных пятен
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
@результаты поиска
Как вы видите, это специальный метод, и приветствуются любые комментарии по нему.
person
makio
schedule
23.05.2015