Запрос структуры хэш-карты с помощью elasticsearch

У меня есть два вопроса относительно сопоставления и запроса хэш-карты 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"
              }
            }
          ]
        }
      }
    }
  }
}

Я делаю что-то неправильно? Как я могу запросить такую ​​структуру? У меня есть возможность изменить отображение, если это необходимо.

Спасибо

0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TLDR;

То, как вы загружаете свои данные, ничего не сохраняется в 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"
              }
            }
          ]
        }
      }
    }
  }
}

Спасибо за ответ. Это не работает. Он возвращает 0 хитов.

hhh3112 18.03.2022 14:35

Спасибо. Это сработало. У меня нет большого опыта работы с elasticsearch, но это: GET /<index_name>/_mapping действительно помогло мне лучше понять сопоставление.

hhh3112 18.03.2022 19:12

Рад, что помог человеку!

Paulo 18.03.2022 21:14

Другие вопросы по теме