Вопросы по обновлению Lucene с 2.2 до 2.9 до 3.1

У меня есть существующая программа, использующая Lucene 2.2.x, и мне нужно обновиться до 3.1. Для этого я прочитал документацию, в которой предлагается сначала обновиться до версии 2.9.x, удалив все предупреждения об опустошении, а затем обновиться до версии 3.1.x. У меня развернуты существующие индексы, с которыми мне необходимо поддерживать совместимость кода.

Мой главный вопрос касается дат обработки. В версии 2.2.x мне пришлось использовать DateTools.dateToString() для преобразования Date.getTime() в строку, которую я мог индексировать и хранить. Я создал два поля на каждом документе. Одно для поиска, которое хранилось с часовым разрешением, и другое, которое не анализировалось. Теперь Lucene 2.9.x поддерживает другие типы данных, отличные от строки. Могут ли эти новые типы использоваться в RangeQueries, если это против предыдущей версии, которая использовала DateTools для преобразования дат в строки? Вот код, который я тоже изменил:

Before:

return new RangeFilter("dateArchived-stored",
                DateTools.dateToString(start, DateTools.Resolution.MILLISECOND),
                DateTools.dateToString(end, DateTools.Resolution.MILLISECOND),
                false, true );

After:

return NumericRangeFilter.newLongRange("dateArchived-stored", 
                                       start.getTime(), 
                                       end.getTime(), true, true );

Теперь, когда Lucene поддерживает нестроковые типы данных, нужно ли нам заботиться о разрешении дат, как мы делали это с запросами Termeries?

IndexWriter требует объявления MaxFieldLimit. В предыдущих версиях этого не делалось. Использует ли UNLIMITED такое же поведение, как и в предыдущих версиях? Наиболее безопасно ли использовать UNLIMITED, учитывая, что есть индексы, которые я буду читать и которые были созданы с 2.2?

Before:

new IndexWriter( indexDirectory, analyzer )

After:

new IndexWriter( FSDirectory.open(indexDirectory), analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED )

Sort objects требует объявления SortField, которое требует типа этого поля. Для существующих полей, индексированных версиями 2.2.x, мы можем объявить поля, ранее индексированные как String к другому типу, или они всегда должны быть SortField.STRING?

Before:

new Sort("timestamp", false )

After:

new Sort(new SortField("timestamp", SortField.LONG, false) )

Будет ли это работать с индексами, встроенными в 2.2.x, но считываемыми по 2.9.x?

Наконец, будут ли у меня проблемы с переходом прямо к 3.1.x с индексами, встроенными в 2.2.x? Я собираюсь перейти на 2.9.x в моей локальной системе разработки, но в поле она будет переходить с 2.2.x прямо на 3.1.x. Должен ли я выпустить версию, использующую 2.9.x?

14
задан Kara 23 January 2014 в 05:37
поделиться