Как Sunspot изменяет схему Solr schema.xml?Это вообще его модифицирует? - PullRequest
16 голосов
/ 25 августа 2011

Дайте мне знать, если я ошибаюсь, но я думаю, что solr ожидает только те поля, которые уже упомянуты в schema.xml.Итак, если у меня есть поле с названием «title», мне нужно упомянуть об этом в схеме.

Нет упоминания об изменении schema.xml в документации Sunspot.Мне просто интересно, как Sunspot изменяет schema.xml, позволяя вводить пользовательские поля в индекс.

Я также знаю, что Sunspot использует RSolr для выполнения каких-либо задач.Поэтому, если есть способ изменить схему и перезагрузить данные из DB в Solr с помощью RSolr, пожалуйста, дайте мне знать.

Ответы [ 2 ]

33 голосов
/ 26 августа 2011

Как намекает karmajunkie, Sunspot использует свою собственную стандартную схему. Я подробнее расскажу о том, как это работает, здесь.

Solr Schema 101

Для целей этого обсуждения схемы Solr в основном состоят из двух вещей: определения типов и определения полей.

Определение type устанавливает тип путем указания его имени, класса Java для типа и, в случае некоторых типов (особенно текстового), подчиненного блока XML, конфигурирующего способ обработки этого типа.

Определение field позволяет определить имя поля и имя типа значения, содержащегося в этом поле. Это позволяет Solr соотносить имя поля в документе с его типом, а также с несколькими другими параметрами и, следовательно, с тем, как значение этого поля должно обрабатываться в вашем индексе.

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

Обычная схема Sunspot

Схема Sunspot содержит несколько field определений для внутренних полей, таких как идентификатор и название модели. Кроме того, Sunspot широко использует определения dynamicField для установления соглашений об именах на основе типов.

Такое использование соглашений об именах полей позволяет Sunspot определять DSL конфигурации, который создает отображение из вашей модели в XML-документ, готовый для индексации Solr.

Например, этот простой блок конфигурации в вашей модели…

searchable do
  text :body
end

… будет использоваться Sunspot для создания имени поля body_text. Это имя поля сопоставляется с шаблоном *_text для следующего определения dynamicField в схеме:

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

Это сопоставляет любое поле с суффиксом _text с определением Sunspot типа text. Если вы посмотрите на schema.xml Sunspot, вы увидите много других аналогичных соглашений для других типов и опций. Например, опция :stored => true обычно добавляет s к суффиксу этого типа (например, _texts).

Практическое изменение схемы Sunspot

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

Например, расширенные совпадения поиска с помощью «нечетких» поисков могут быть выполнены со совпадениями со специальным текстовым полем, которое также использует лингвистические основы или NGrams. Жетоны в исходном поле text могут использоваться для заполнения проверки орфографии или для повышения точных совпадений. А токены в пользовательском text_ngram или text_en могут служить для расширения результатов поиска при сбое более строгого сопоставления.

DSL в Sunspot предоставляет одну заключительную функцию для сопоставления ваших полей с этими пользовательскими полями. После того, как вы настроили type и соответствующие ему определения dynamicField, вы можете использовать опцию Sunspot :as, чтобы переопределить генерацию имени на основе соглашения.

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

searchable do
  text :body
  text :body_ngram, :as => 'body_ngram'
end
4 голосов
/ 26 августа 2011

Sunspot поставляется со стандартной схемой, слегка настроенной на интеграцию солнечных пятен, которая придерживается принципа наименьшего удивления для разработчика - например, в файле solrconfig.xml отключена автоматическая фиксация, даже если вы работаете в рабочей среде. Я хочу включить это. Схема действительно имеет больше общего с types , чем с полями - см. Ссылку ниже для примера того, как создать новый тип поля. Индексирование поля тривиально, если оно вписывается в один из существующих типов. Например:

class Blog
  searchable do
     text :title
  end
end

И в процессе поиска вы будете делать что-то вроде этого:

class BlogSearch
   def self.search(options={})
     Sunspot.search(Blog) do
       with(:title, options[:title]) if options[:title].present?
     end
   end
end

В вики Sunspot есть много дополнительной документации. Вот пример добавления пользовательского типа для разрешения поиска по ngram:

https://github.com/outoftime/sunspot/wiki/Wildcard-searching-with-ngrams

...