Solr переинтерпретирует поле во время репликации

У меня есть облако Solr (версия 4.10.3), состоящее из 3 экземпляров Solr, управляемых Zookeeper. Каждое ядро ​​реплицируется с текущего лидера на два других для резервирования.

Теперь к проблеме. Мне нужно проиндексировать поле даты и времени из SQL как TextField для запросов с подстановочными знаками (не лучшее решение, но тем не менее требование). На ядре, которое выполняет импорт, все выглядит так, как должно, и поле содержит такие значения, как: 2008.10.18 17:16:31.0, но соответствующий документ (синхронизированный обработчиком репликации) на других ядрах имеет такие значения, как: Sat Oct 18 17:16:31 CEST 2008 для того же поля. Я пытался какое-то время безуспешно докопаться до сути этого. За исключением этого, поведение как ядра, так и облака является ожидаемым.

Кто-нибудь знает, что я делаю неправильно?

Тип поля выглядит следующим образом:

<fieldType name="stringD" class="solr.TextField" sortMissingLast="true" omitNorms="false">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>           
        <filter class="solr.PatternReplaceFilterFactory" pattern="([-])" replacement="." replace="all" />
    </analyzer>
</fieldType> 

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


person dmncr    schedule 23.01.2015    source источник


Ответы (1)


Итак, мой первый ответ идет на мой первый вопрос здесь;)

При первоначальной настройке этого ядра использовался подобный импорт-запрос.

SELECT * FROM [TABLE]

а затем поля были сопоставлены таким образом в обработчике импорта данных.

<field column="ENDTIME" name="ENDTIME" />

Когда Solr начал преобразовывать содержимое столбца [ENDTIME] (datetime2) в SQL в дату, это было добавлено в запрос на импорт.

CAST(CAST(ENDTIME as datetime2(0)) as varchar(100)) as ENDTIMESTR

чтобы заставить правильный формат из SQL: 2008-10-18 17:16:31.0.

Сопоставление обработчика импорта данных также было изменено на следующее: <field column="ENDTIMESTR" name="ENDTIME" />

Из-за этого как [ENDTIME], так и [ENDTIMESTR] пришли из SQL в обработчик импорта данных, и Solr каким-то образом смог использовать только правильное поле / тип поля на ядре, которое инициировало полный импорт. При репликации поля на другие ядра Solr, похоже, смотрел на исходный столбец [ENDTIME] (существующий только в обработчике импорта данных во время полного/дельта-импорта, помните SELECT * FROM [TABLE]). ENDTIME в Solr-схеме все это время было TextField.

РЕШЕНИЕ: удалить * и вместо этого явно определить все поля в полных/дельта-запросах с [ENDTIME], выглядящими как CAST(CAST(ENDTIME as datetime2(0)) as varchar(100)) as ENDTIME.

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

Надеюсь, это может помочь кому-то еще на скользком склоне Solr!

person dmncr    schedule 24.01.2015