Индексирование различных полей с различным типом поля в Sunspot (Solr) - PullRequest
2 голосов
/ 20 августа 2011

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

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

<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

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

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

1 Ответ

2 голосов
/ 21 августа 2011

Как вы заметили, вы можете дублировать строки в вашем блоке searchable для полей, которые вы хотите проиндексировать несколькими различными способами.На самом деле я бы порекомендовал это, так как вы на самом деле сохраняете некоторую гранулярность полей (как будет показано ниже), и у вас есть несколько хороших помощников Sunspot, таких как опция inline :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 блоке.

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

...