Сортировка многозначных полей Solr по значениям полей - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть несколько экземпляров Solr с отдельными схемами.

Мне нужно получить многозначное поле в отсортированном порядке, например по типу: train_station, airport, city_district и т. д .:

q=köln&sort=query({!v="type:(airport OR train_station)"}) desc

Я бы хотел увидеть документ типа аэропорта перед типом train_station. Сейчас я всегда получаю тип train_station вверху.

Как мне написать запрос?

Ответы [ 4 ]

6 голосов
/ 01 марта 2012

Вы получаете train_station s на вершине из-за ИДФ.

Быстрый способ его исправить - использовать запрос диапазона (который имеет преимущество, заключающееся в наличии постоянных оценок) и усиление запроса: q=köln&sort=query({!v="type:([airport TO airport]^3 OR [train_station TO train_station]^2)"}) desc.

Таким образом, документы, которые имеют airport в своем поле типа, будут иметь оценку 3, документы, которые имеют train_station в их поле типа, будут иметь оценку 2, а документы, имеющие airport и train_station в их типе поля будет иметь счет 2 + 3 = 5 (для мультипликативной константы).

Более элегантный (и эффективный) способ сделать это - написать собственный анализатор запросов (или даже запрос функции).

1 голос
/ 01 марта 2012

Вы не можете решить эту проблему внутри SOLR.Проверьте документацию, SOLR не сортирует многозначные поля.Старые версии SOLR позволили вам попробовать, но результаты были неопределенными и непредсказуемыми.

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

1 голос
/ 29 февраля 2012

Вы можете отсортировать функцию, только если она возвращает одно значение для каждого документа. Вы определенно не можете сортировать по многозначному полю или любому полю, которое является токенизированным. Похоже, вам понадобится функция, которая возвращает «аэропорт», если поле содержит «аэропорт» (даже если оно содержит «вокзал») и «вокзал», если оно содержит «вокзал», но не «аэропорт», а затем сортировать на этом.

Другим вариантом будет обработать это во время индекса. Добавьте поле с именем "airport_train_station_sort", которое возвращает 1, если поле содержит "airport", 2, если поле содержит "train station", но НЕ airport, и 3, если оно не содержит ни того, ни другого. Затем просто отсортируйте это поле.

0 голосов
/ 29 февраля 2012

Чтобы упорядочить элементы внутри самого поля, вы должны либо проиндексировать его по своему желанию, либо выполнить постобработку. Сольр сортирует только документы!

...