Solr / Sunspot - определить язык индексирования во время выполнения, динамически выбирать анализаторы - PullRequest
7 голосов
/ 22 декабря 2010

Я хотел бы использовать Solr + Sunspot для индексации двуязычного сайта FR-EN.Вопрос: модель Post может быть написана как на французском, так и на английском языке.Я могу определить во время выполнения, что это за язык, но мне также нужно, чтобы Solr соответствующим образом индексировал модель.

Например: для французских моделей мне понадобится французский стеммер,

<filter class="solr.SnowballPorterFilterFactory" language="French"/>

Какие у меня варианты?Могу ли я изменить анализаторы Solr во время выполнения?Могу ли я сделать набор анализаторов для каждого языка?

Ответы [ 2 ]

10 голосов
/ 22 декабря 2010

Это отличный вопрос, и эта функция обсуждается для включения в Sunspot.

Sunspot использует соглашения об именах динамических полей для настройки своей схемы.Например, вот два существующих определения для текстовых полей:

<dynamicField name="*_text" stored="false" type="text" multiValued="true" indexed="true"/>
<dynamicField name="*_texts" stored="true" type="text" multiValued="true" indexed="true"/>

Они соответствуют 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>

Вы можете добавить аналогичное определение дляразличные языки, которые вы хотели бы проиндексировать (как упоминает также Маурисио), а затем установите новые определения 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>

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"/>

3.Использование французского текстового поля в Sunspot

Последний Sunspot 1.2 (не совсем выпущенный - используйте 1.2.rc4) поддерживает опцию :as, которая позволяет указать имя поля.

searchable do
  text :description, :as => 'description_text_fr'
end

Как я уже сказал, это то, что я собираюсь добавить в Sunspot 1.3 или 1.4.Лично я хотел бы видеть что-то вроде :lang => :en в определении текстового поля, чтобы выбрать соответствующее определение поля.Не стесняйтесь присоединиться к списку рассылки Sunspot со своими мыслями!

2 голосов
/ 22 декабря 2010

Не могу ничего сказать о Sunspot, но в чистом Solr я бы создал отдельные типы полей в вашей схеме Solr (один fieldType для французского, другой для английского), а затем создал бы одно поле для английского контента (используя английский fieldType)и другое поле для французского контента (используя французское fieldType).

Поскольку вы знаете, какой язык использовать во время выполнения, вам просто нужно выбрать одно или другое поле, чтобы выполнить поиск и получить результаты.

...