2013-02-14 2 views
10

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

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

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

Кроме того, я уверен, что существует вероятность того, что оба существуют.

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

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

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

Бизнес-правило № 2: 99% запросов будут использовать ПОСЛЕДНЮЮ дату, но RANDOM-клиент и случайный отчет.

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

ВОПРОСЫ:

Указанные критерии поиска, а эти способы написать запрос:

A) Q = дата: 20130214 И клиент: Джо & facet.field = дата & facet.field = клиент ...

B) д = дата: 20130214 & FQ = клиент: Джо & facet.field = дата & facet.field = клиент ...

C) д = клиент: Джо & FQ = дата: 20130214 & facet.field = дата & facet.field = клиент ...

D) Q = *: * & FQ = дата: 20130214 & FQ = клиент: Джо & facet.field = дата & facet.field = клиент ...

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

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

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

ответ

3

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

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

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

+1

Благодарим вас за ответ. Если я скажу fq = 20130214 & q = client: Paige, значит ли это, что Solr придется сначала сканировать 250 миллионов документов для клиента: Paige, а затем фильтровать их, чтобы оставить их только на дату 20130214? Если да, не было бы более эффективным сначала найти все на дату (3,5 миллиона документов), а затем фильтровать на основе клиента? И еще больший вопрос: как я могу сказать, поскольку, похоже, нет инструментов, позволяющих опробовать оба сценария. –

+1

Да, запрос фильтра будет выполнен после выполнения основного поиска. Но на основе ваших номеров документов вы можете переключить их и «q = 20130214 & fq = client: Paige», как вы знаете, вам нужно будет искать только 3,5 миллиона документов с датой, а затем фильтровать их, чтобы возвращать правильный клиент , Как определить правильный подход не сложно и быстро, это зависит от потребностей и сценария. Что касается инструментов для тестирования запросов, я бы очень рекомендовал SolrMeter - http://code.google.com/p/solrmeter/ –

+0

Спасибо Paige. Вы ответили по-разному в двух разных ответах (на основе бизнес-правил и основанных на числах), поэтому я уточнил свой первоначальный вопрос. Не могли бы вы посмотреть еще раз. Кроме того, SolrMeter не показывает, как Solr обрабатывает запрос, который кэширует его, в каком порядке, что он находит и т. Д. Если вы знакомы с Sybase (или любой РСУБД), я ищу эквивалент 'set showplan on' Спасибо, -Дмитрий. –

17

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

q=*:* только что вернет все документы с одинаковым счетом.

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

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

Facets являются дополнением к результатам и не влияют на результаты.

+0

Спасибо за публикацию всех этих полезных ответов на SO !! –

+0

Почему нисходящий? Пожалуйста, добавьте комментарий, чтобы я мог улучшить свой ответ, если он больше не действителен !!!! – Jayendra

+1

@Jayendra Основной запрос: он всегда говорит, что fq используется для фильтрации документов и помогает в последующих поисках через кеш. Предположим, что у меня 100M docs равномерно распределены по 100 категориям. Если я использую запрос (q) и fq = cat: 5, тогда будет solr в первую очередь искать только документы с этим cat: 5 или искать все 100M, а затем фильтровать cat: 5? Если первое верно, скорость поиска также выполняется быстрее (а не только последующие поиски, попадающие в filterCache). – Ethan

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