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

时间:2016-09-28 14:13:58

标签: solr solrcloud

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

  1. 修改schema.xml并将datetimeformat="dd/MM/yyyy"属性添加到所涉及的<field />标记中,但我尚未对其进行测试。或者,
  2. 修改solrconfig.xml并将<str>dd/MM/yyyy</str>标记添加到班级solr.ParseDateFieldUpdateProcessorFactory的处理器中。我确信这是有效的,因为我亲自测试了它。
  3. 我想使用托管架构和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.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。我尝试了各种组合但没有效果:"name":"solr.ParseDateFieldUpdateProcessorFactory""name":"ParseDateFieldUpdateProcessorFactory""name":""

    更新2

    运行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类型的 updateRequestProcessorChaindocumentation州:

      

    Config API不允许您创建或编辑<updateRequestProcessorChain>元素。但是,可以创建<updateProcessor>条目,并可以按名称使用它们来创建链。

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

2 个答案:

答案 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)

你有很多困惑:

  1. datetimeformat用于DataImportHandler映射定义。架构文件中没有datetimeformat
  2. 如果您使用的是托管架构,则实际上没有schema.xml,您有托管架构文件
  3. 如果您使用的是最近的Solr,则需要Config API来修改solrconfig.xml。实际上,与托管模式不同,您可以修改单独的overlay.json文件,但最终结果是相同的。
  4. 因此,您必须在UpdateRequestProcessor中设置格式,但您可以通过API(在最近的Solr中)进行管理。