2010-06-02 3 views
0

Я установил свою первую «установку» Solr, где каждый индекс (документ) представляет собой музыкальную работу (со свойствами типа number (int), title (string), version (string), composers (string) и keywords (строка)). Я установил поле «title» как поле поиска по умолчанию.Solr: как мне индексировать и искать несколько полей?

Однако, что мне делать, когда я хотел бы сделать запрос во всех полях? Я хотел бы предоставить пользователям возможность поиска во всех полях, и, насколько я понял, существует как минимум два варианта:

(1) Укажите, в каких полях запрос должен быть сделан против ,

(2) Настройте конфигурацию Solr с помощью полей копий, чтобы значения, добавленные в каждое из полей, были скопированы в поле «catch-all», которое можно использовать для поиска. Однако в этом случае я не уверен, как все получится, когда я буду учитывать, что типы данных не все одинаковы для разных полей (различные поля будут в меньшей степени проходить через фильтры, но как копирование значения берутся из их исходных полей до того, как значения будут выполняться через фильтры исходных полей, я должен был бы применить один единственный фильтр ко всем значениям в поле копирования. Это также приведет к тому, что целые числа будут «отфильтрованы» так же, как строки бы).

Это случай, когда я должен использовать copyfields? На первый взгляд кажется, что это немного более «гибкий», а просто поиск по всем полям. Однако, может быть, есть стоимость?

Все отзывы оценены! Благодаря!

ответ

1

При выполнении поля копирования данные в поле назначения будут проиндексированы с использованием анализатора, определенного для этого поля. Поэтому, если вы определяете поле назначения как текстовые данные, лучше всего копировать в него текстовые данные. Так что да, копирование целого числа в одном поле, вероятно, не имеет смысла. Но вы действительно хотите, чтобы пользователь мог искать ваше поле «число» в поиске по умолчанию? Это имеет смысл для названия, композитора и ключевого слова, но, возможно, не для целочисленного поля, которое, вероятно, представляет идентификатор в вашей базе данных.

Другой вариант запроса по всем полям - использовать Dismax. Вы можете точно указать, какие поля вы хотите запросить, но также определите конкретные загрузки для каждого из них. Вы также можете определить сортировку по умолчанию, добавить дополнительный импульс для более свежих документов и многих других причудливых вещей.

+0

Благодарим вас за ответ. Однако я задаюсь вопросом, есть ли у него какие-либо последствия (например, по производительности) для поиска по нескольким полям вместо поиска в одном поле на основе скопированных значений полей (copy-field)? – sbrattla

+0

Производительность, я не думаю, что существует значительная разница между поиском в другом поле VS много раз в одном поле. Lucene должен выполнять двоичный поиск для каждого члена запроса. Независимо от того, выполняет ли n поиск в одном и том же поле или n поисков в разных полях, не должно быть разным. –

+0

Спасибо за ваш вклад! – sbrattla

Смежные вопросы