我想为dd/MM/yyyy
类型的字段指定日期格式date
。
我知道以下方法:
schema.xml
并将datetimeformat="dd/MM/yyyy"
属性添加到所涉及的<field />
标记中,但我尚未对其进行测试。或者,solrconfig.xml
并将<str>dd/MM/yyyy</str>
标记添加到班级solr.ParseDateFieldUpdateProcessorFactory
的处理器中。我确信这是有效的,因为我亲自测试了它。我想使用托管架构和Schema 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"
,则会收到错误消息。
是否可以使用仅 Schema API编辑日期格式而无需编辑任何*.xml
文件?
我尝试了这个命令没有任何成功:
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
。我尝试了各种组合但没有效果:"name":"solr.ParseDateFieldUpdateProcessorFactory"
,"name":"ParseDateFieldUpdateProcessorFactory"
,"name":""
。
运行curl http://localhost:8983/solr/test/config
会返回一个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州:
Config API不允许您创建或编辑
<updateRequestProcessorChain>
元素。但是,可以创建<updateProcessor>
条目,并可以按名称使用它们来创建链。
这意味着无法使用Config API向现有solr.ParseDateFieldUpdateProcessorFactory
添加特定日期格式。我应该创建一个自定义更新处理器来执行我想要的操作,因此请使用add-updateprocessor
API和适当的参数。
答案 0 :(得分:1)
在可怕的Solr文档上挣扎之后,我找到了解决方案。 documentation州:
Config API不允许您创建或编辑
<updateRequestProcessorChain>
元素。但是,有可能 创建<updateProcessor>
条目,并可以按名称使用它们来创建 链。[...]
您可以通过添加a直接在请求中使用此功能 特定更新的
<updateRequestProcessorChain>
中的参数 处理器名为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"]
}
}'
要通过test
处理程序将数据加载到/update/csv
集合中,请使用以下命令:
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
。
答案 1 :(得分:0)
你有很多困惑:
因此,您必须在UpdateRequestProcessor中设置格式,但您可以通过API(在最近的Solr中)进行管理。