В Solr, Как сделать запрос к одному полю для различного набора значений в многозначном поле - PullRequest
3 голосов
/ 11 февраля 2010

Я в основном хочу, чтобы Solr просматривал каждую запись многозначного поля для моего параметра поиска. Читайте мой пример:

Я использую Solr для индексации своих данных. У меня есть данные приложения в параллельных массивах (в форме многозначных полей), которые соответствуют данному продукту. Смотрите следующий пример, где make, model и year являются многозначными полями:

<-solr record start-><br> sku: 1234 <br> make: acura, acura, acura <br> model: integra, rsx, rsx<br> year: 1997, 2004, 2000<br> engine: 3.4, 4.5, 4.5<br> <-solr record end->

Я использую запросы фильтра (& fq =), чтобы сузить выбор. Проблема в том, что если кто-то ищет Acura Integra 2000 года, она будет соответствовать приведенной выше записи, но, поскольку данные о марке, модели и году кодируются параллельно, на самом деле для этого продукта нет Acura Integra 2000 года. Solr сопоставляет марку в поле make, модель в поле модели и год в поле year (как и должно быть) и возвращает этот результат, не учитывая мой параллелизм. Мой запрос будет выглядеть так:

<br> fq=make:"acura"&fq=model:"integra"&fq=year:2000 <i>(I would normally escape URL characters when I POST to Solr, this is just an example)</i>

Таким образом, мое решение состояло в том, чтобы создать другое многозначное поле, называемое сводным полем, в которое я бы поместил все данные о марке, модели, году и других данных (например, движок), разделенные пробелом. Необходимо заключать в кавычки слова, чтобы термины с несколькими словами не совпадали с параметрами поиска. Приведенный выше пример теперь будет выглядеть так:

<-solr record start-><br> sku: 1234 <br> make: acura, acura, acura <br> model: integra, rsx, rsx<br> year: 1997, 2004, 2000<br> engine: 3.4, 4.5, 4.5<br> summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"<br> <-solr record end->

Затем я добавляю к своему запросу следующее:

summary:(""acura" AND "integra" AND "2000")

Если бы я добавил это к своему запросу, я бы ожидал, что эта запись больше не будет появляться, поскольку в поле сводки нет acura integra 2000. Тем не менее, это не работает. Запись все еще идет. Я в тупике. У кого-нибудь есть решение этой проблемы. Это убивало меня несколько дней.

Я в основном хочу, чтобы Solr просматривал каждую запись в многозначном поле для моего параметра поиска. Возможно ли это? Есть ли лучший способ сделать то, что я пытаюсь сделать?

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

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

Взгляните на следующий пример:

Ниже приведено содержимое поля сводки в одной из строк в многозначном поле, которое я хочу сопоставить: "Honda" "Accord" "2004" "3.5L"

Вот запрос, который я буду выполнять: summary_field:("\"Honda\" \"2004\"")<br> <br>

Вышеупомянутый запрос не будет работать. Несмотря на то, что у меня может быть функция, которая переводит пользовательский ввод из приложения в тот же порядок, в котором было построено исходное сводное поле, потому что пользователи в приложении могут вводить данные (марку, модельный год) в любом порядке. могут быть другие слова между данными, которые я пытаюсь сопоставить. В приведенном выше примере я хочу сравнить Honda 2004 с этой записью. Тем не менее, Согласие между ними.

Чтобы обойти эту проблему, просто используйте оператор ~ n, где n - максимальное количество других терминов между терминами, которые вы ищете. Так что, если я вместо этого использую:

summary_field:("\"Honda\" \"2004\""~1)

Я говорю, что между Хондой и 2004 годом существует вероятность того, что есть еще одно слово. Таким образом, этот запрос будет соответствовать. Даже если вы добавите несколько терминов в поле сводки, если вы выполняете запрос к нему со значениями в том же порядке, и ваша логика нечеткого поиска использует число, которое будет максимальным расстоянием между двумя значениями, ваш запрос всегда будет правильно совпадать правильное итоговое поле. Таким образом, если у вас есть 20 полей, которые вы добавляете в свое итоговое поле для поддержания параллелизма, вам просто нужно использовать ~ 18, поскольку это максимально возможное расстояние в худшем случае между словами, которые может выбрать пользователь.

3 голосов
/ 11 февраля 2010

Кажется, что ваша схема не совсем правильная. Вам необходимо полностью денормализовать ваши данные и создать один документ для каждого транспортного средства. Что означает «транспортное средство», зависит от того, какие поиски вы будете проводить. Например, возможная схема будет:

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

Сводное поле будет copyField of make + model + years + engine

0 голосов
/ 11 февраля 2010

Разве вы не можете просто сделать запрос следующим образом?

make:acura AND model:integra AND year:2000

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

...