Фильтрация по диапазону дат в Lucene - PullRequest
1 голос
/ 16 июля 2010

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

Я должен отфильтровать результаты поиска по диапазону дат.Дата каждого документа хранится (но не индексируется) на каждом.При использовании фильтра я заметил, что фильтр вызывается со всеми документами в индексе.

Это означает, что фильтр будет работать медленнее с ростом индекса (в настоящее время в нем всего ~ 300 000 документов), поскольку он должен выполнять итерациюкаждый отдельный документ.

Я не могу использовать RangeQuery, поскольку дата не проиндексирована.

Как применить фильтр ПОСЛЕ ТОЛЬКО к документам, являющимся результатами запроса, чтобы сделать егоболее эффективно?

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

Ответы [ 2 ]

3 голосов
/ 17 июля 2010

Не совсем уверен, поможет ли это, но у меня была проблема, похожая на вашу, и я предложил следующее (+ примечания):

  1. Я думаю, вам действительно нужно проиндексировать поле даты. Ничто другое не имеет смысла с точки зрения запросов / фильтрации и т. Д.
  2. В Lucene.net v2.9 запросы на диапазон, где есть много терминов, выглядят ужасно медленными по сравнению с v2.9
  3. Я исправил проблемы со скоростью при использовании полей даты, переключившись на использование числовых полей и запросов к числовым полям. Это на самом деле дало мне прирост скорости по сравнению с моей базовой версией Lucene.net v2.4.
  4. Заключение запроса в фильтр кэширующей оболочки означает, что вы можете зависнуть от бита документа, установленного для фильтра. Это также значительно ускорит последующие запросы с использованием того же фильтра.
  5. Фильтр не играет роли в оценке для набора результатов запроса
  6. Присоединение вашего кэшированного фильтра к остальной части вашего запроса (где, я полагаю, у вас есть пользовательские оценки и коллекторы) означает, что он должен соответствовать последней части ваших критериев

Итак, подведем итог: индексируйте свои поля даты как числовые поля; строить ваши запросы как запросы числового диапазона; преобразуйте их в кэшированные фильтры и повесьте на них.

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

Удачи!

p.s. Я бы никогда не догадался, что будет быстрым или медленным при использовании Lucene. Я всегда был удивлен в обоих направлениях!

1 голос
/ 16 июля 2010

Сначала, чтобы отфильтровать поле, оно должно быть проиндексировано.

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

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

...