У меня есть два вопроса относительно сопоставления и запроса хэш-карты Java в elasticsearch.
Имеет ли это сопоставление смысл в elasticsearch (это правильный способ сопоставления хэш-карты)?:
{
"properties": {
"itemsMap": {
"type": "nested",
"properties": {
"key": {
"type": "date",
"format": "yyyy-MM-dd"
},
"value": {
"type": "nested",
"properties": {
"itemVal1": {
"type": "double"
},
"itemVal2": {
"type": "double"
}
}
}
}
}
}
}
Вот некоторые примеры данных:
{
"itemsMap": {
"2021-12-31": {
"itemVal1": 100.0,
"itemVal2": 150.0,
},
"2021-11-30": {
"itemVal1": 200.0,
"itemVal2": 50.0,
}
}
}
Мои запросы не работают. Например:
{
"query": {
"nested": {
"path": "itemsMap",
"query": {
"bool": {
"must": [
{
"match": {
"itemsMap.key": "2021-11-30"
}
}
]
}
}
}
}
}
Я делаю что-то неправильно? Как я могу запросить такую структуру? У меня есть возможность изменить отображение, если это необходимо.
Спасибо
То, как вы загружаете свои данные, ничего не сохраняется в key
.
У вас будут поля с именами 2021-11-30
... а key
будет пустым.
Либо у вас ограниченное количество «дат», и это жизнеспособные варианты (менее 1000), иначе ваш формат нежизнеспособен в долгосрочной перспективе.
Если вы не хотите менять свой документ, вот запрос
GET /71525899/_search
{
"query": {
"nested": {
"path": "itemsMap",
"query": {
"bool": {
"must": [
{
"exists": {
"field": "itemsMap.2021-12-31"
}
}
]
}
}
}
}
}
Если вы проверяете сопоставление, запрашивая индекс
GET /<index_name>/_mapping
Вы увидите, что количество имен полей после вашей даты будет расти.
И во всех ваших документах itemsMap.key
будет пустым. (это объясняет, почему мой предыдущий ответ не сработал.
Сохраняйте картографию, обновляйте форму своих документов.
Они будут выглядеть
{
"itemsMap": [
{
"key": "2021-12-31",
"value": { "itemVal1": 100, "itemVal2": 150 }
},
{
"key": "2021-11-30",
"value": { "itemVal1": 200, "itemVal2": 50 }
}
]
}
DELETE /71525899
PUT /71525899/
{
"mappings": {
"properties": {
"itemsMap": {
"type": "nested",
"properties": {
"key": {
"type": "date",
"format": "yyyy-MM-dd"
},
"value": {
"type": "nested",
"properties": {
"itemVal1": {
"type": "double"
},
"itemVal2": {
"type": "double"
}
}
}
}
}
}
}
}
POST /_bulk
{"index":{"_index":"71525899"}}
{"itemsMap":[{"key":"2021-12-31", "value": {"itemVal1":100,"itemVal2":150}},{"key":"2021-11-30", "value":{"itemVal1":200,"itemVal2":50}}]}
{"index":{"_index":"71525899"}}
{"itemsMap":[{"key":"2022-12-31", "value": {"itemVal1":100,"itemVal2":150}},{"key":"2021-11-30", "value":{"itemVal1":200,"itemVal2":50}}]}
{"index":{"_index":"71525899"}}
{"itemsMap":[{"key":"2021-11-31", "value": {"itemVal1":100,"itemVal2":150}},{"key":"2021-11-30", "value":{"itemVal1":200,"itemVal2":50}}]}
GET /71525899/_search
{
"query": {
"nested": {
"path": "itemsMap",
"query": {
"bool": {
"must": [
{
"match": {
"itemsMap.key": "2021-12-31"
}
}
]
}
}
}
}
}
Спасибо. Это сработало. У меня нет большого опыта работы с elasticsearch, но это: GET /<index_name>/_mapping действительно помогло мне лучше понять сопоставление.
Рад, что помог человеку!
Спасибо за ответ. Это не работает. Он возвращает 0 хитов.