Индексация разных полей с разными типами полей в Sunspot (Solr)

Я хотел бы настроить индексацию таким образом, чтобы результаты с фонетическим соответствием имели меньший вес, чем обычные совпадения.

Для этого я создал два разных набора fieldType в моем schema.xml для текста:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
  </analyzer>
</fieldType>
<fieldType name="text_phonetic" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
  </analyzer>
</fieldType>

и создал динамическое поле, использующее фонетическую фабрику:

<dynamicField name="*_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/>

Теперь в моей модели я могу сделать что-то вроде:

text :name, :as => :name_phonetic

и это работает нормально.

Мой вопрос: как лучше всего настроить кучу полей для использования как обычной индексации текстового поля, так и фонетической, с более высоким усилением по сравнению с первым? Я могу просто продублировать все мои строки индексации в моей модели, но есть ли способ сделать это непосредственно в схеме с конструкцией и сделать это доступным в полнотекстовом запросе солнечных пятен?


person spike    schedule 20.08.2011    source источник


Ответы (1)


Как вы заметили, вы можете дублировать строки в своем блоке searchable для полей, которые вы хотите проиндексировать несколькими различными способами. На самом деле я бы рекомендовал это, так как вы на самом деле поддерживаете более детализированные поля (как будет показано ниже), и у вас есть несколько хороших помощников Sunspot, таких как встроенная опция :boost.

Тем не менее, вы также можете использовать директиву Solr copyField в схеме. Это выглядит примерно так:

<copyField source="source_field" dest="dest_field" maxChars="N" />

Имя исходного поля может быть шаблоном, однако целевым должно быть одно поле. Кроме того, я считаю, что место назначения должно быть определено как его собственное field, а не как имя, соответствующее dynamicField.

Учитывая эти ограничения, вы можете настроить что-то вроде этого в своей схеме:

<fields>
  ...
  <field name="all_text_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/>
  ...
</fields>

<copyField source="*_text" dest="all_text_phonetic" />
<copyField source="*_texts" dest="all_text_phonetic" />

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

Так что жеребьевка. Но это ваши варианты.

person Nick Zadrozny    schedule 20.08.2011
comment
Хорошо, похоже, это на самом деле лучший способ пойти. спасибо за комментарии - person spike; 22.08.2011