2016-02-11 3 views
6

У меня есть MySQL запрос:Replicate Выравнивание по левому краю по нескольким полям в Solr

select t1.to_step,count(t1.to_step) from tmp t1 left join tmp t3 on 
(t1.to_step = t3.from_step and t1.applicant_id=t3.applicant_id) 
where t3.to_step is null group by t1.to_step 

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

ниже того, что я использую:

q: "-_query_:\"{!join from=from_step_s to=to_step_s}from_step_s:[* TO *]\"", 

Это дает мне частичный набор результатов. В основном мой solr-документ состоит из полей applicant_id, from_step_s и to_step_s, и я хочу получить документ, где соединение от to_step_s до from_step_s не существует для определенного набора applicant_id. Я думаю, что проблема в том, что соединение applicant_id не выполняется в запросе solr (который я не знаю, как это сделать), из-за которого from_step_s одного документа сопоставляется с to_step_s другого документа с различными applicant_id.

ответ

2

Ваш вопрос о соединении основан на двух полях (с каждой стороны).

Короткий ответ: вы не можете этого сделать.

Основная логика для JoinQuery находится в org.apache.solr.search.JoinQuery.JoinQueryWeight.getDocSet(). Как вы увидите, нет никаких сохраненных полей или поиска, которые вы могли бы изменить из одного поля в два поля.

Erick Erickson Ответ:

Вы не должны делать это.

Solr живет от де-нормировки. Почему бы не добавить новое поле и не объединить старые? Почему бы не использовать ваше sql-соединение при индексировании и добавить информацию, которая вам нужна непосредственно в индекс?

+0

Но есть ли способ, по которому я могу перебирать результирующий набор родительского запроса изнутри подзапроса или что-то подобное для итерации по набору результатов? –

+0

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

+1

Если время не имеет значения: вы можете создать свой собственный QueryComponent или QParser и работать непосредственно на lucene индекс. Если весь ваш «претендент_ид» со всеми соответствующими DocSet может быть кэширован в основной памяти, вы даже можете подумать о своей собственной версии JoinQuery. –

Смежные вопросы