Я хотів би вказати формат дати dd/MM/yyyy
для поля типу date
. Я знаю такі методи:
- редагувати
schema.xml
і додатиdatetimeformat="dd/MM/yyyy"
атрибут до<field />
тег залучений, але я його не перевіряв. Або, - редагувати
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
У вас є купа речей, сплутаних тут:
- datetimeformat - для визначення відображення DataImportHandler. У файлі схеми немає формату datetime
- Якщо ви використовуєте керовану схему, ви насправді не маєте schema.xml, у вас є файл керованої схеми
- Якщо ви використовуєте останні Solr, ви використовуєте API налаштування змінити solrconfig.xml. Насправді, на відміну від керованої схеми, ви змінюєте окремий файл overlay.json, але кінцевий результат однаковий.
Отже, вам потрібно встановити формат в UpdateRequestProcessor, але ви можете керувати цим за допомогою API (у недавньому Solr).