Обратный запрос диапазона Solr

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

У меня есть коллекция solr, в которой есть ряд числовых полей, которые являются диапазонами, например:

pr_high_max = 10.35
pr_high_min = 8.15

pr_med_max = 12.55
pr_med_min = 10.40

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

Мне нужно запросить solr с ценой товара и получить документ с этой ценой в одном из диапазонов, мне нужно иметь возможность присвоить ему вес, чтобы высокие поля имели приоритет над средними полями. По сути, это обратный поиск RANGE.

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

До сих пор мне удалось собрать этот функциональный запрос:

 prboost:sum(
 if(and(query({!edismax v='pr_high_max:[8 TO *]' }),query({!edismax v='pr_high_min:[* TO 8]'})),5,0),
 if(and(query({!edismax v='pr_med_max:[8 TO *]' }),query({!edismax v='pr_med_min:[* TO 8]'})),3,0),
 if(and(query({!edismax v='pr_low_max:[8 TO *]' }),query({!edismax v='pr_low_min:[* TO 8]'})),1,0),
 )

Где 8 — это цена, которую я буду передавать, в основном это проверяет, находится ли цена в каком-либо из диапазонов, и если это так, я возвращаю значение: 5 для максимума, 3 для медиана, 1 для минимума. . В идеале я хотел бы включить это в обычное взвешивание, но я не смог добавить это как подзапрос. Кроме того, если я попытаюсь увеличить его, я вернусь «Бесконечная рекурсия обнаружила запрос на синтаксический анализ« pr_high_max: [8 TO *] »»

Кто-нибудь сталкивался с чем-то подобным раньше? Любые идеи?

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

заранее спасибо


person nick_v1    schedule 23.04.2014    source источник


Ответы (1)


Хорошо, потребовалось некоторое время, но я понял, мне пришлось добавить пустой параметр повышения к каждому запросу, вот что работает. Я суммирую все значения, начиная с 1 (поскольку без него любое дополнительное повышение приведет к значению меньше 1 и фактически оштрафует документ). Каждый подзапрос выполняется, и в зависимости от того, какой из них будет совпадать, повышение будет увеличено на 1, 5, 10 или 15 процентов.

sum(1, if(and(query({!edismax boost='' v='pr_shigh_max:[$doc->{pr} TO *]' }),query({!edismax boost=''       v='pr_shigh_min:[* TO $doc->{pr}]'})),0.15,0), 
if(and(query({!edismax boost='' v='pr_high_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_high_min:[* TO $doc->{pr}]'})),0.1,0), 
if(and(query({!edismax boost='' v='pr_med_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_med_min:[* TO $doc->{pr}]'})),0.05,0), 
if(and(query({!edismax boost='' v='pr_low_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_low_min:[* TO $doc->{pr}]'})),0.01,0))
person nick_v1    schedule 05.05.2014