Solr copyField, смешанный с RegexTransformer - PullRequest
1 голос
/ 25 января 2012

Сценарий:

В базе данных у меня есть поле с именем Categories , которое имеет тип string и содержит число разделенных символом труб, таких как 1|8|90|130|

Что я хочу:

В индексе Solr я хочу иметь 2 поля:

  • Поле Категории _ труба , которая будет содержать точную строку, как в БД, т.е. 1|8|90|130|
  • Поле Категории , которое будет многозначным полем типа INT, содержащим значения 1, 8, 90 и 130

Для последнего, в спецификации сущности я могу использовать regexTransformer, а затем указать следующее поле в data-config.xml: <field column="Categories" name="Navigation" splitBy="\|"/> и затем укажите поле как многозначное в schema.xml

Чего я не знаю, так это как я могу «скопировать» одно и то же поле дважды и выполнить разбиение регулярного выражения только на одном. Я знаю, что есть средство copyField, которое можно определить в schema.xml, однако я не могу найти способ преобразовать скопированное поле, потому что, насколько я знаю (и я могу ошибаться здесь), преобразователи доступны только в сущности спецификация.

В качестве обходного пути я также могу дважды отправить одно и то же поле из запроса сущности, но в действительности поле Categories является вычисляемым полем (выбирает вложенное), которое несколько дорого, поэтому я хотел бы избежать его .

Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Вы можете создать два столбца из одних и тех же данных и обрабатывать их отдельно.

ВЫБРАТЬ категории, категории в виде category_pipe ОТ категории_таблицы

Затем вы можете разбить столбец «категории», но индексировать другой как есть.

1 голос
/ 25 января 2012

Вместо разделения на data-config.xml. Вы можете сделать это в вашем schema.xml. Вот что ты мог сделать,

  1. Создайте fieldType с токенизатором PatternTokenizerFactory, который использует регулярное выражение для разделения на основе |.
  2. FieldSplit : создайте поле multivalued, используя это new fieldType, в конечном итоге будет 1,8,90,130
  3. FieldOriginal : Создать поле String (если вам не требуется анализ по нему), сохраняющее исходное значение 1 | 8 | 90 | 130 |
  4. Теперь вы можете использовать copyField для копирования значений FieldSplit, FieldOriginal в зависимости от ваших потребностей.

Проверьте это Вопрос , это похоже.

...