/ / Solr: Чи можливо змінити формат дати для певного поля, використовуючи лише API-схему? - solr, solrcloud

Solr: Чи можливо змінити формат дати для певного поля, використовуючи лише API Schema? - solr, solrcloud

Я хотів би вказати формат дати dd/MM/yyyy для поля типу date. Я знаю такі методи:

  1. редагувати schema.xml і додати datetimeformat="dd/MM/yyyy" атрибут до <field /> тег залучений, але я його не перевіряв. Або,
  2. редагувати solrconfig.xml і додати a <str>dd/MM/yyyy</str> тег до процесора класу solr.ParseDateFieldUpdateProcessorFactory. Я впевнений, що це працює, тому що я особисто перевірив це.

Я хотів би використовувати керовану схему та API схеми замість редагування schema.xml. Це зручно і корисно як в автономному, так і в хмарому 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" під час створення або редагування полів, я отримую помилку.

Чи можна редагувати формат дати за допомогою тільки API Schema без редагування *.xml файл?

UPDATE

Я спробував цю команду без жодного успіху:

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 атрибут. Якщо я опущу "name" атрибут у запиті JSON, Solr видає помилку "name" is a required field. Я пробував різні комбінації, але жодна не працювала: "name":"solr.ParseDateFieldUpdateProcessorFactory", "name":"ParseDateFieldUpdateProcessorFactory", "name":"".

UPDATE 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 це тип updateRequestProcessorChain. The документація стверджує:

API Config не дозволяє створювати або редагувати <updateRequestProcessorChain> елементів. Однак можна створити <updateProcessor> записів і може використовувати їх за іменем для створення ланцюжка.

Це означає, що неможливо додати певний формат дати до існуючого solr.ParseDateFieldUpdateProcessorFactory за допомогою API Config. Я повинен створити власний процесор оновлення, який робить те, що я хочу, і тому використовую add-updateprocessor API з належними параметрами.

Відповіді:

1 для відповіді № 1

Після боротьби з жахливою документацією Solr я знайшов рішення. документація стверджує:

API Config не дозволяє створювати або редагувати <updateRequestProcessorChain> елементів. Однак це можливо створити <updateProcessor> записів і може використовувати їх за іменем для створення файлу ланцюжок.

[...]

Ви можете використовувати це безпосередньо у своєму запиті, додавши параметр у <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.


0 для відповіді № 2

У вас є купа речей, сплутаних тут:

  1. datetimeformat - для визначення відображення DataImportHandler. У файлі схеми немає формату datetime
  2. Якщо ви використовуєте керовану схему, ви насправді не маєте schema.xml, у вас є файл керованої схеми
  3. Якщо ви використовуєте останні Solr, ви використовуєте API налаштування змінити solrconfig.xml. Насправді, на відміну від керованої схеми, ви змінюєте окремий файл overlay.json, але кінцевий результат однаковий.

Отже, вам потрібно встановити формат в UpdateRequestProcessor, але ви можете керувати цим за допомогою API (у недавньому Solr).