Сортировка многозначных полей Solr на основе значений полей

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

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

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

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

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


person nicck_par    schedule 29.02.2012    source источник


Ответы (4)


Вы получаете train_station наверху из-за ЦАХАЛа.

Быстрый способ исправить это — использовать запрос диапазона (преимущество которого состоит в том, что он имеет постоянные оценки) и повышения запроса: 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 (до мультипликативной константы).

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

person jpountz    schedule 29.02.2012
comment
Почему вы выбрали диапазон вместо прямого сравнения типа «тип: (аэропорт ^ 3 ИЛИ поезд_станция ^ 2)»? - person rounak; 28.08.2013
comment
Потому что даже при бустах все равно учитывается ЦАХАЛ. С вашим запросом, если train_station намного реже, чем аэропорт, документы, содержащие его, будут оцениваться выше, чем документы, содержащие аэропорт. - person jpountz; 30.08.2013

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

Другим вариантом было бы обрабатывать это во время индексации. Добавьте поле с именем «airport_train_station_sort», которое возвращает 1, если поле содержит «аэропорт», 2, если поле содержит «вокзал», но НЕ аэропорт, и 3, если оно не содержит ни того, ни другого. Затем просто отсортируйте по этому полю.

person David Faber    schedule 29.02.2012

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

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

person Michael Dillon    schedule 01.03.2012

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

person Fuxi    schedule 29.02.2012