В Solr, как запросить к одному полю отдельный набор значений в многозначном поле
-
19-09-2019 - |
Вопрос
По сути, я хочу, чтобы Solr искал каждую запись многозначного поля для моего параметра поиска.читайте мой пример:
Я использую Solr для индексации своих данных.У меня есть данные приложения в параллельных массивах (в виде многозначных полей), соответствующих данному продукту.См. следующий пример, где марка, модель и год являются многозначными полями:
<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
<-solr record end->
Я использую фильтрующие запросы (&fq=), чтобы сузить выбор.Проблема в том, что если кто-то найдет Acura Integra 2000 года выпуска, он будет соответствовать приведенной выше записи, но поскольку данные о марке, модели и году кодируются параллельно, для этого продукта фактически не существует Acura Integra 2000 года выпуска.Solr сопоставляет марку в поле «Марка», модель в поле «Модель» и год в поле «Год» (как и должно быть) и возвращает этот результат, не соблюдая мой параллелизм.Мой запрос пока будет выглядеть так:
fq=make:"acura"&fq=model:"integra"&fq=year:2000 (Обычно я экранирую символы URL-адреса при отправке POST в Solr, это всего лишь пример)
Поэтому моим решением было создать еще одно многозначное поле, называемое полем сводки, в которое я бы поместил все данные о марке, модели, году и других данных (например, о двигателе), разделенных пробелом.Слова необходимо заключать в кавычки, чтобы термины, состоящие из нескольких слов, случайно не совпадали с параметрами поиска.Приведенный выше пример теперь будет выглядеть так:
<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"
<-solr record end->
Затем я добавляю к своему запросу следующее:
summary:(""acura" AND "integra" AND "2000")
Если бы я добавил это в свой запрос, я ожидал бы, что эта запись больше не появится, поскольку в поле сводки нет acura integra 2000.Однако это не работает.Запись все еще висит.Я в тупике.Есть ли у кого-нибудь решение этой проблемы.Это убивает меня уже несколько дней.
По сути, я хочу, чтобы Solr искал каждую запись многозначного поля для моего параметра поиска.Это возможно?Есть ли лучший способ сделать то, что я пытаюсь сделать?
Спасибо
Решение 2
Я до сих пор не уверен, как поддерживать параллелизм без сводного поля, но я понял, как это сделать с помощью сводного поля.Вместо использования операторов AND, которые, как я полагаю, ищут совпадение в каждой записи в многозначном поле (каждый термин с оператором AND может соответствовать другой строке в многозначном поле, не обязательно одной и той же строке), вы вместо этого помещаете точные термины, которые вы хотите которые вы ищете, в том же порядке, в котором вы создавали исходную сводную запись, и используйте оператор ~.
Взгляните на следующий пример:
Ниже приведено содержимое поля сводки в одной из строк многозначного поля, которое я хочу сопоставить:
"Honda" "Accord" "2004" "3.5L"
Вот запрос, который я запущу:
summary_field:("\"Honda\" \"2004\"")
Один только приведенный выше запрос не будет работать.Несмотря на то, что у меня может быть функция, которая помещает пользовательский ввод из приложения в тот же порядок, в котором было создано исходное поле сводки, поскольку пользователи в приложении могут вводить фрагмент данных (марку, модельный год) в любом порядке, там между данными, которые я пытаюсь сопоставить, могут быть другие слова.В приведенном выше примере я хочу сопоставить Honda 2004 года с этим рекордом.Однако Аккорд находится между ними.
Чтобы обойти эту проблему, просто используйте оператор ~n, где n — максимальное количество других терминов между терминами, которые вы ищете.Итак, если я вместо этого использую:
summary_field:("\"Honda\" \"2004\""~1)
Я говорю, что между Honda и 2004 годом есть вероятность появления еще одного слова.Следовательно, приведенный выше запрос будет соответствовать.Даже если вы добавите несколько терминов в поле сводки, если вы запрашиваете его со значениями в том же порядке, а ваша логика нечеткого поиска использует число, которое будет максимальным расстоянием между двумя значениями, ваш запрос всегда будет правильно соответствовать правильное поле сводки.Итак, если у вас есть 20 полей, которые вы добавляете в поле сводки для обеспечения параллелизма, вам просто нужно использовать ~18, поскольку это максимально возможное расстояние в худшем случае между словами, которые может выбрать пользователь.
Другие советы
Похоже, ваша схема не совсем верна.Вам необходимо полностью денормализовать данные и создать один документ для каждого автомобиля.Что означает «транспортное средство», зависит от того, какой поиск вы будете проводить.Например, возможная схема может быть такой:
sku: 1234
make: acura
model: integra
years: 1997
engines: 3.4, 4.5
sku: 1235
make: acura
model: rsx
years: 2000, 2004
engines: 4.5
Поле сводки будет копировать поле марки+модели+года+двигателей.
Не могли бы вы просто выполнить запрос следующим образом?
make:acura AND model:integra AND year:2000
Т.е.Без кавычек вокруг марки и модели.