Solr 在复制期间重新解释字段

Solr reinterprets field during replication

我有一个由 Zookeeper 管理的 3 个 Solr 实例组成的 Solr(版本 4.10.3)云。每个核心都从当前领导者复制到其他 2 个核心以实现冗余。

现在进入正题。我需要从 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> 

这里是 link to a screenshot 展示行为的全部荣耀,顶部部分来自执行完全导入的核心。

所以我的第一个答案是我的第一个问题 ;)

最初设置此核心时,使用了这样的导入查询。

SELECT * FROM [TABLE]

然后字段在数据导入处理程序中像这样映射。

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

当 Solr 开始将 SQL 中 [ENDTIME] (datetime2) 列的内容转换为日期时,这被添加到导入查询中。

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 不知何故只能在核心上使用正确的 field/fieldType启动全进口。将字段复制到其他核心时,Solr 似乎查看了原始的 [ENDTIME] 列(仅在 full/delta-import 期间存在于数据导入处理程序中,请记住 SELECT * FROM [TABLE])。 Solr 模式中的 ENDTIME 一直是一个 TextField。

解决方案:删除 * 并改为显式定义 full/delta-queries 中的所有字段 [ENDTIME] 如下所示 CAST(CAST(ENDTIME as datetime2(0)) as varchar(100)) as ENDTIME.

现在一切都按预期运行。我想在某处的数据导入处理程序映射中存在错误,但我的配置也不是最好的。

希望这可以帮助其他人摆脱 Solr 的困境!