Основной запрос solr vs fq

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

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

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

Кроме того, я уверен, что есть причина, по которой они существуют.

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

  • В моих документах есть: дата, клиент, отчет и некоторые другие поля.
  • 1 деловая дата = 3,5 миллиона документов.
  • Общее количество документов составляет 250 миллионов и подсчет (60 дат * 8000 клиентов * 1000 отчетов)
  • Я граничу по дате, клиенту, отчету, и я использую тегирование фасетов.
  • Общий интерфейс выглядит как любой сайт электронной коммерции, например: Amazon, с гранями слева.
  • Подсчет очков не используется.

Бизнес-правило №1: дата должна всегда присутствовать в каждом запросе.

Бизнес-правило № 2: 99% запросов будут использовать самую позднюю дату, но RANDOM-клиент и случайный отчет.

A Факт: Мы определили, что его огранка медленная, а не поисковая.

ВОПРОСЫ:

Учитывая эти критерии поиска и эти способы написания запроса: <Я >

A) q = date: 20130214 И клиент: Joe и facet.field = date и facet.field = client...

B) q = date: 20130214 и fq = client: Joe и facet.field = date и facet.field = client...

C) q = client: Joe и fq = date: 20130214 и facet.field = date и facet.field = client...

D) q = *: * и fq = date: 20130214 и fq = client: Joe и facet.field = date и facet.field = client...

  • какой из вышеперечисленных вы считаете лучшим и почему? Помните, что большинство запросов будут работать против 20130214.
  • в FQ-фильтрации, сделанной первым, а затем применяется условие Q или наоборот?

Сегодня у меня есть D) используется во всех случаях, но я подозреваю, что это неправильно и вызывает OOM в Solr (версия 3.6).

Благодарим за помощь!

Ответ 1

q запрос является основным запросом запроса.
Это тот, который позволит вам выполнять поиск по нескольким полям.
q запрос будет определять, какой счет имеет каждый документ и, следовательно, будет участвовать в расчете релевантности.

q=*:* просто вернет все документы с одинаковой оценкой.

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

В идеале вы должны проверить, что требует требование, если вы хотите искать, всегда используйте q, и если вы хотите фильтровать/ограничивать результаты, вы должны использовать fq.

Границы - это просто аддон к результатам и не влияет на ваши результаты.

Ответ 2

Чтобы ответить на ваши вопросы:

  • Основываясь на вашем бизнес-правиле, я бы предположил, что вы поместили дату в значение fq, так как вы всегда ограничиваете (фильтровать) результаты значением даты, и похоже, что значения даты могут быть повторно использованы Solr. И Q может содержать поиск случайных значений клиента и отчета по мере необходимости.

  • Когда пользователь впервые приходит к пользовательскому интерфейсу, поскольку вы показываете только грани, я бы предложил использовать q=<id field>:*, где <id field> - ваш идентификатор документа в индексе, а также установить rows=0. Снова используйте ограничение даты в значении fq. Задание rows=0 приведет к запросу только фасетного объекта, ссылка Solr - Получение фасетов без возврата результатов