В Solr, как запросить к одному полю отдельный набор значений в многозначном поле

StackOverflow https://stackoverflow.com/questions/2243093

Вопрос

По сути, я хочу, чтобы 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

Т.е.Без кавычек вокруг марки и модели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top