Solr:是否可以仅使用架构 API 更改特定字段的日期格式?
Solr: Is it possible to change date format for a specific field using only the Schema API?
我想为 date
类型的字段指定日期格式 dd/MM/yyyy
。
我知道以下方法:
- 编辑
schema.xml
,将datetimeformat="dd/MM/yyyy"
属性添加到涉及的<field />
标签中,但我没有测试过。或者,
- 编辑
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.ParseDateFieldUpdateProcessorFactory
在solrconfig.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
是 类型的 updateRequestProcessorChain
。 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.
这意味着无法使用配置 API 将特定日期格式添加到现有 solr.ParseDateFieldUpdateProcessorFactory
。我应该创建一个自定义更新处理器来执行我想要的操作,因此使用具有适当参数的 add-updateprocessor
API。
你在这里混淆了一堆东西:
- datetimeformat 用于 DataImportHandler 映射定义。架构文件中没有日期时间格式
- 如果您使用的是托管架构,那么您实际上并没有 schema.xml,您拥有的是托管架构文件
- 如果您使用的是最新的 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
.
我想为 date
类型的字段指定日期格式 dd/MM/yyyy
。
我知道以下方法:
- 编辑
schema.xml
,将datetimeformat="dd/MM/yyyy"
属性添加到涉及的<field />
标签中,但我没有测试过。或者, - 编辑
solrconfig.xml
并为 classsolr.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.ParseDateFieldUpdateProcessorFactory
在solrconfig.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
是 类型的 updateRequestProcessorChain
。 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.
这意味着无法使用配置 API 将特定日期格式添加到现有 solr.ParseDateFieldUpdateProcessorFactory
。我应该创建一个自定义更新处理器来执行我想要的操作,因此使用具有适当参数的 add-updateprocessor
API。
你在这里混淆了一堆东西:
- datetimeformat 用于 DataImportHandler 映射定义。架构文件中没有日期时间格式
- 如果您使用的是托管架构,那么您实际上并没有 schema.xml,您拥有的是托管架构文件
- 如果您使用的是最新的 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 calledprocessor=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
.