2016-08-10 9 views
0

По сути, основная задача: индексировать поля DateTime и TimeSpan и делать диапазоны и точные поиски по ним позже.Lucene.NET: Рекомендуемый способ индексирования и поиска полей DateTime и TimeSpan

Интернетов повсюду: учебные пособия, ссылающиеся на устаревшие версии Lucene.NET; руководства, рекомендующие хранить даты и время как ints, как longs, как строки; документы, которые рекомендуют использовать NumericRangeQueries; сообщения в блогах, которые рекомендуют TermRangeQueries; GitHub комментирует, что говорят, что числовое - это путь, и о, мой.

Для любви все, что память управляется и мусор, давайте компилировать ссылку ультра-всеобъемлющие и супер-уточненный для тех бедняг, которые отправляются на полнотекстовой поиск пути:

  1. Что Analyzer должно быть и должно не использоваться при индексации даты и времени
  2. Как следует дата и время храниться в Document и какие Field типы должны быть использованы
  3. Как сделать диапазон Qu тальные для даты (DateTime значения) и раз (TimeSpan значения)
    • ... с использованием стандартных QueryParser
    • ... при построении Query объектов
    • вручную ... если писать собственные QueryParser
  4. Как сделать точные совпадения Ф.О. г дата (DateTime значения) и раз (TimeSpan значения)
    • ... с использованием стандартных QueryParser
    • ... при ручном построении Query объектов
    • ... при написании своего собственного QueryParser

ответ

1

Не настоящий форум для этого типа o f (для Q & A). Я бы с удовольствием сотрудничал с wiki ... Но некоторые комментарии, чтобы вы пошли.

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

Одна вещь уверена ... всегда преобразовать в UTC

Я обычно благоприятствуют с помощью числовых полей. Преобразование дат в семантические числа. Итак, 10 августа 2016 = 20160810. Время просто расширяется, чтобы добавить HH, MM и SS. Некоторые функции полезности делают это достаточно простым.

У меня была система, в которой можно было бы определить «точность» каждого поля.

Это делает его доступным для чтения/записи и позволяет диапазоны. Хотя это означает, что запросы без диапазона не очень хороши.

Та же схема может использоваться со строковыми полями с UN_TOKENIZED или анализатором ключевых слов. В этом случае вы можете написать TokenFilter/Analyzer для анализа введенной даты и преобразования в стандартный формат выше или стандартного формата ISO, который также можно сортировать (чтобы диапазоны работали).

Некоторые из этих вариантов будет зависеть от того, как сторона поиска будет работать ...

Если необходимо разобрать запрос в виде строки, то Lucene QueryParser немного ограничивает. У меня был собственный парсер (на основе Irony.net).

Если это за API, это отдельные аргументы из /, то эта часть может быть построена вручную и объединена с анализируемой частью с использованием BooleanQuery или Filter (фильтр хорош, если повторять эти же даты/диапазоны).

Итак, у вас есть это ... ответ без ответа. Нет «одного размера подходит всем». Подумайте об этом немного, как о разработке DataWarehouse. Дизайн несколько зависит от запросов/отчетов, которые вы хотите создать