У меня есть индекс, для которого я установил отображение на "dynamic":"strict"
.
Как и ожидалось, по большей части, если введено поле, не указанное в сопоставлении, Elasticsearch
отклонит его.
Однако я обнаружил, что любое поле со значением null
не перехватывается и сделает его моим показатель. Вот как выглядит мое отображение:
{
"myindex": {
"mappings": {
"mystuff": {
"dynamic": "strict",
"_id": {
"store": true,
"index": "not_analyzed"
},
"_timestamp": {
"enabled": true,
"store": true
},
"_index": {
"enabled": true
},
"_type": {
"store": true
},
"properties": {
"entitlements": {
"type": "nested",
"properties": {
"accountNumber": {
"type": "string",
"index": "not_analyzed"
},
"active": {
"type": "string",
"index": "not_analyzed"
},
"assetEndDate": {
"type": "date",
"format": "date_time_no_millis"
}
}
}
}
}
}
}
}
РЕДАКТИРОВАТЬ (включая примеры сценариев)
С приведенным выше сопоставлением вот сценарии, которые я вижу:
1) При публикации действительного документа (тот, который соответствует сопоставлению), 200 OK
.
размещенный документ:
{
"entitlements": [
{
"accountNumber": "123213",
"active": "true",
"assetEndDate": "2016-10-13T00:00:00Z"
}
]
}
Ответ эластичного поиска:
{
"_index": "myindex",
"_type": "mystuff",
"_id": "5",
"_version": 1,
"created": true
}
2) При размещении недействительного документа (тот, который не соответствует отображению), 400 StrictDynamicMappingException
.
размещенный документ:
{
"entitlements": [
{
"accountNumber":"123213",
"XXXXactive": "true",
"assetEndDate": "2016-10-13T00:00:00Z"
}
]
}
Ответ эластичного поиска:
{
"error": "StrictDynamicMappingException[mapping set to strict, dynamic introduction of [Xactive] within [entitlements] is not allowed]",
"status": 400
}
3) При публикации недопустимого документа (не соответствующего сопоставлению) со значением null
для недопустимого поля 200 OK
.
размещенный документ:
{
"entitlements": [
{
"accountNumber":"123213",
"XXXXactive": null,
"assetEndDate": "2016-10-13T00:00:00Z"
}
]
}
Ответ эластичного поиска:
{
"_index": "myindex",
"_type": "mystuff",
"_id": "7",
"_version": 1,
"created": true
}
4) При публикации недопустимого документа (не соответствующего сопоставлению) со значением null
для недопустимого поля 200 OK
.
размещенный документ:
{
"entitlements": [
{
"accountNumber":"123213",
"XXXXactive": null,
"assetEndDate": "2016-10-13T00:00:00Z",
"THIS_SHOULD_NOT_BE_HERE": null
}
]
}
Ответ эластичного поиска:
{
"_index": "myindex",
"_type": "mystuff",
"_id": "9",
"_version": 1,
"created": true
}
Меня беспокоят 3-й и 4-й сценарии.
Похоже, эта проблема (или очень похожая) поднималась в Elasticsearch
репозитории git здесь и с тех пор был закрыт. Однако проблема, по-видимому, все еще существует в версии 1.7.
Это видно локально, а также в индексах, которые я развернул с помощью AWS Elasticsearch
Service.
Я где-то ошибаюсь, или кто-нибудь нашел решение этой проблемы?