用elasticsearch查询hashmap结构

Query hashmap structure with elasticsearch

我有两个关于在 elasticsearch 中映射和查询 java hashmap 的问题。

这个映射在 elasticsearch 中有意义吗(它是映射 hashmap 的正确方法)?:

{
  "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"
              }
            }
          ]
        }
      }
    }
  }
}

我是不是做错了什么?我如何查询这样的结构?如果有必要,我可以更改映射。

谢谢

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"
              }
            }
          ]
        }
      }
    }
  }
}