首页 > 解决方案 > 将日期类型 (solr.TrieDateField) 复制到字符串类型 (solr.TextField) 时,Solr CopyField 行为奇怪

问题描述

我正在使用以下方法将日期字段复制到字符串字段(schema.xml): <copyField source="mydate" dest="mystr"/>

source 和 dest 类型定义为:

<field name="mydate" type="solr.TrieDateField" indexed="true" stored="true"/>
<field name="mystr" type="solr.TextField" indexed="true" stored="true"  multiValued="true"/>

mydate 的值为“2009-06-03T00:00:00Z”

我期望 mystr 中的值相同,即“2009-06-03T00:00:00Z”,但我在 mystr 中获得了不同格式的日期。我在 mystr 中得到的值是“Wed Jun 03 00:00:00 UTC 2009”。

我在 solrcloud 模式下运行 solr 并且有 2 个节点 solr 集群。此外,此行为仅在 solrcloud 模式下发生。如果我将 solr 作为单个节点运行,这将完美运行。

我正在寻求帮助以将源日期原样(不更改格式)放入 mystr 字段。

我知道我可以通过在 DIH 中定义一个单独的字符串字段并设置值来实现这一点,但我很想知道为什么上面的副本不能按预期工作。

标签: solr

解决方案


这里的核心问题是日期字段在 copyField 发生时已经被解析。因此,您将内部日期表示扩展回副本的文本。

禁用“无模式模式”的经典模式不应该发生这种情况。也许这就是为什么它不会在独立版本中发生。对于 SolrCloud,很可能在对象被发送到不同节点之前已经解析到现有字段。然后,各个节点实际执行 copyField 指令。无论如何,这是我的假设,我没有仔细研究来源。

解决方案是使用UpdateRequestProcessor(例如 CloneFieldUpdateProcessorFactory),因为它肯定会准确复制您发送的内容。如果需要,它可以与 DIH 结合使用。请注意阅读与您的 Solr 版本匹配的手动版本,因为有多种调用 URP 的方法,具体取决于您正在运行的内容。

您可能还会发现我所做的基于该前提的 Solr 谜题很有趣(好吧,您已经知道部分答案了)。


推荐阅读