Solr:是否可以仅使用架构 API 更改特定字段的日期格式?

Solr: Is it possible to change date format for a specific field using only the Schema API?

我想为 date 类型的字段指定日期格式 dd/MM/yyyy。 我知道以下方法:

  1. 编辑schema.xml,将datetimeformat="dd/MM/yyyy"属性添加到涉及的<field />标签中,但我没有测试过。或者,
  2. 编辑 solrconfig.xml 并为 class solr.ParseDateFieldUpdateProcessorFactory 的处理器添加一个 <str>dd/MM/yyyy</str> 标签。我确信这有效,因为我亲自测试过它。

我想使用托管架构和架构 API 而不是编辑 schema.xml。这在独立和 Cloud Solr 中都很方便和有用。

为了添加一个date字段,我是这样操作的:

curl http://localhost:8983/solr/test/schema -X POST -H 'Content-type:application/json' --data-binary '
{   
  "add-field":
  {
    "name":"mydate",     
    "type":"date",
    "stored":true, 
    "indexed":true
  }
}'

并编辑一些字段属性,例如 stored 属性,我这样做:

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "replace-field":
  {
    "name":"mydate",
    "stored":false
  }
}' http://localhost:8983/solr/test/schema

如果我在创建或编辑字段期间尝试设置 "datetimeformat":"dd/MM/yyyy",我会收到错误消息。

是否可以在不编辑任何 *.xml 文件的情况下仅使用 架构 API 来编辑日期格式?

更新

我试过这个命令但没有成功:

curl http://localhost:8983/solr/test/config -H 'Content-type:application/json' -d '
{
  "update-updateprocessor" : 
  {
    "class": "solr.ParseDateFieldUpdateProcessorFactory", 
    "name":"solr.ParseDateFieldUpdateProcessorFactory",
    "format":["dd/MM/yyyy"]
  }
}'

问题是solr.ParseDateFieldUpdateProcessorFactorysolrconfig.xml中的原始定义是:

<processor class="solr.ParseDateFieldUpdateProcessorFactory">
  <arr name="format">
    <str>yyyy-MM-dd'T'HH:mm:ss.SSSZ</str>
    <str>yyyy-MM-dd'T'HH:mm:ss,SSSZ</str>
    <str>yyyy-MM-dd'T'HH:mm:ss.SSS</str>
    <str>yyyy-MM-dd'T'HH:mm:ss,SSS</str>
    <str>yyyy-MM-dd'T'HH:mm:ssZ</str>
    <str>yyyy-MM-dd'T'HH:mm:ss</str>
    <str>yyyy-MM-dd'T'HH:mmZ</str>
    <str>yyyy-MM-dd'T'HH:mm</str>
    <str>yyyy-MM-dd HH:mm:ss.SSSZ</str>
    <str>yyyy-MM-dd HH:mm:ss,SSSZ</str>
    <str>yyyy-MM-dd HH:mm:ss.SSS</str>
    <str>yyyy-MM-dd HH:mm:ss,SSS</str>
    <str>yyyy-MM-dd HH:mm:ssZ</str>
    <str>yyyy-MM-dd HH:mm:ss</str>
    <str>yyyy-MM-dd HH:mmZ</str>
    <str>yyyy-MM-dd HH:mm</str>
    <str>yyyy-MM-dd</str>
  </arr>
</processor>

并且它没有 name 属性。如果我在 JSON 请求中省略 "name" 属性,Solr 会抛出错误 'name' is a required field。我尝试了各种组合,但 none 有效:"name":"solr.ParseDateFieldUpdateProcessorFactory""name":"ParseDateFieldUpdateProcessorFactory""name":"".

更新 2

运行 curl http://localhost:8983/solr/test/config returns 一个 JSON 对象。这是其中的一部分:

{
...
    "updateRequestProcessorChain":[{
    "name":"add-unknown-fields-to-the-schema",
    "":[{"class":"solr.UUIDUpdateProcessorFactory"},
      {"class":"solr.LogUpdateProcessorFactory"},
      {"class":"solr.DistributedUpdateProcessorFactory"},
      {"class":"solr.RemoveBlankFieldUpdateProcessorFactory"},
      {
        "class":"solr.FieldNameMutatingUpdateProcessorFactory",
        "pattern":"[^\w-\.]",
        "replacement":"_"},
      {"class":"solr.ParseBooleanFieldUpdateProcessorFactory"},
      {"class":"solr.ParseLongFieldUpdateProcessorFactory"},
      {"class":"solr.ParseDoubleFieldUpdateProcessorFactory"},
      {"class":"solr.ParseDateFieldUpdateProcessorFactory"},
      {"class":"solr.AddSchemaFieldsUpdateProcessorFactory"},
      {"class":"solr.RunUpdateProcessorFactory"}]}],
...
}

这意味着 solr.ParseDateFieldUpdateProcessorFactory 类型的 updateRequestProcessorChaindocumentation 状态:

The Config API does not let you create or edit <updateRequestProcessorChain> elements. However, it is possible to create <updateProcessor> entries and can use them by name to create a chain.

这意味着无法使用配置 API 将特定日期格式添加到现有 solr.ParseDateFieldUpdateProcessorFactory。我应该创建一个自定义更新处理器来执行我想要的操作,因此使用具有适当参数的 add-updateprocessor API。

你在这里混淆了一堆东西:

  1. datetimeformat 用于 DataImportHandler 映射定义。架构文件中没有日期时间格式
  2. 如果您使用的是托管架构,那么您实际上并没有 schema.xml,您拥有的是托管架构文件
  3. 如果您使用的是最新的 Solr,您有 Config API 修改 solrconfig.xml。实际上,与managed-schema不同的是,你修改一个单独的overlay.json文件,但最终结果是一样的。

因此,您必须在 UpdateRequestProcessor 中设置格式,但您可以通过 API(在最近的 Solr 中)进行管理。

在处理可怕的 Solr 文档之后,我找到了解决方案。 documentation 状态:

The Config API does not let you create or edit <updateRequestProcessorChain> elements. However, it is possible to create <updateProcessor> entries and can use them by name to create a chain.

[ ... ]

You can use this directly in your request by adding a parameter in the <updateRequestProcessorChain> for the specific update processor called processor=firstFld.

这意味着我必须添加自定义更新处理器并在使用 /update 处理程序时 显式 调用它。所以:

curl http://localhost:8983/solr/test/config -H 'Content-type:application/json' -d '
{
  "add-updateprocessor" : 
  {
    "name" : "myCustomDateUpdateProcessor", 
    "class": "solr.ParseDateFieldUpdateProcessorFactory", 
    "format":["dd/MM/yyyy"]
  }
}'

要通过 /update/csv 处理程序将数据加载到 test 集合中,请使用此命令:

curl http://localhost:8983/solr/test/update/csv?processor=myCustomDateUpdateProcessor&commit=true --data-binary @file.csv -H 'Content-type:text/plain; charset=utf-8'

注意 processor=myCustomDateUpdateProcessor 的存在,其中 myCustomDateUpdateProcessor 是我之前创建的更新处理器。处理器存储在 configoverlay.json 而不是 solrconfig.xml.