2010-02-11 2 views
3

я в основном хочу Solr искать каждую запись многозначного поля для моего параметра поиска .. читать для моего примера:В 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 =), чтобы сузить мой выбор. Проблема в том, что если кто-то ищет 2000 Acura Integra, он будет соответствовать вышеупомянутой записи, но поскольку данные о make, model и year закодированы параллельно, на самом деле нет 2000 Acura Integra для этого продукта. Solr соответствует марку в поле make, модели в поле модели и году в поле года (как и должно быть) и возвращать этот результат, а не уважать мой параллелизм. мой запрос будет выглядеть следующим образом до сих пор:


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

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

<-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 выполнял поиск каждой записи многозначного поля для моего параметра поиска .. это возможно? Есть ли лучший способ сделать то, что я пытаюсь сделать?

Thanks

ответ

3

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

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

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

Вот запрос Я буду запускать: summary_field:("\"Honda\" \"2004\"")

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

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

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

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

3

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

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 замыкающих + модель + лет + двигатели

+0

Эй. Это было мое оригинальное решение, и оно отлично работает! Единственная проблема, когда вы переходите на экран продукта моего сайта, вы просматриваете количество приложений, а не количество продуктов. Если один и тот же make, model и year принадлежит к sku, и только двигатель или подмодель отличается, я просто заявляю, что в разделе «подходит» под продуктом. Например, я мог бы свернуть 4 приложения вместе в один «ящик» продукта на моем сайте. Результаты поиска должны сказать, что просмотр 1 из 1. Вместо этого он говорит, что просмотр 4 из 4 (хотя на экране есть один ящик). Следовательно, моя новая схема ... – Dan

+0

@ Dan: взгляните на сворачивающееся поле: http://wiki.apache.org/solr/FieldCollapsing –

+0

Поскольку проблема в SKU (12345) может поместиться в несколько транспортных средств. имея каждый автомобиль SKU +, поскольку его собственная запись хороша, но просмотр их как клиента ужасен. Свернув каждое транспортное средство (и приложения) и привязывая его к тому же SKU, который он подходит, он делает его более удобным для просмотра. Однако, возможно, вы просматриваете 10 приложений на странице, но у вас есть только 3 «коробки», в которых пользователь может что-то купить. Так говорится в разделе «Просмотр элементов с 1 по 10», но перечислены только 3 «коробки» с картинками и кнопка «нажмите, чтобы купить». – Dan

0

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

make:acura AND model:integra AND year:2000 

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