在Elasticsearch中存储和搜索单位和值范围

cedebl8k  于 2023-05-06  发布在  ElasticSearch
关注(0)|答案(1)|浏览(84)

我想为一个文档存储多个数值范围(integer_range数组)。每组范围都与一个单元(文本字段)相关联。
下面是一个例子:

PUT nested_index/_doc/1
{
  "operating_temperature": [
    {
      "unit": "kelvin",
      "value": [
        {
          "gte": 300,
          "lte": 500
        }
      ]
    },
    {
      "unit": "celcius",
      "value": [
        {
          "gte": 0,
          "lte": 30
        },
        {
          "gte": 70,
          "lte": 200
        }
      ]
    }
  ]
}

PUT nested_index/_doc/2
{
  "operating_temperature": [
    {
      "unit": "celcius",
      "value": [
        {
          "gte": 30,
          "lte": 400
        }
      ]
    }
  ]
}

现在我想查询一个operating_temperature范围为400到450开尔文的文档。我应该从这个查询中只得到文档1。
我这样构造我的查询:

GET nested_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "operating_temperature",
            "query": {
              "term": {
                "operating_temperature.unit": {
                  "value": "kelvin"
                }
              }
            }
          }
        },
        {
          "nested": {
            "path": "operating_temperature",
            "query": {
              "range": {
                "operating_temperature.value": {
                  "gte": 400,
                  "lte": 450
                }
              }
            }
          }
        }
      ]
    }
  }
}

这不会返回任何匹配项。我不明白为什么它不工作。

oewdyzsn

oewdyzsn1#

字段operating_temperature.value应该是数组?如果不是数组,我建议避免使用数组来方便查询。问题是您还没有确定范围查询中的字段(value.gte和value.lte)。

GET nested_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "inner_hits": {},
            "path": "operating_temperature",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "operating_temperature.unit": {
                        "value": "kelvin"
                      }
                    }
                  },
                  {
                    "range": {
                      "operating_temperature.value.gte": {
                        "lte": 400
                      }
                    }
                  },
                  {
                    "range": {
                      "operating_temperature.value.lte": {
                        "gte": 450
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

相关问题