从 Elasticsearch 查询数据

Querying data from Elasticsearch

使用 Elasticsearch 7.*,尝试在索引 'com-prod' 上执行 SQL 查询:

GET /com-prod/_search
{
  "script_fields": {
    "test1": {
      "script": {
        "lang": "painless",
        "source": "params._source.ElapsedTime"
      }
    }
  }
}

它给出了输出和下面的成功命中之一:

"hits" : [
      {
        "_index" : "com-prod",
        "_type" : "_doc",
        "_id" : "abcd",
        "_score" : 1.0,
        "fields" : {
          "test1" : [
            "29958"
          ]
        }
      }

现在,我尝试将 ElapsedTime 增加 2,如下所示:

GET /com-prod/_search
{
  "script_fields": {
    "test2": {
      "script": {
        "lang": "painless",
        "source": "params._source.ElapsedTime + 2"
      }
    }
  }
}

但它实际上将数字 2 添加到输出中,如下所示:

"hits" : [
      {
        "_index" : "com-prod",
        "_type" : "_doc",
        "_id" : "abcd",
        "_score" : 1.0,
        "fields" : {
          "test2" : [
            "299582"
          ]
        }
      }

请指导这里可能有什么问题,以及如何获得 29960 的输出。

您得到的是 299582,而不是 29960,因为 ElapsedTime 字段是字符串类型 ("29958"),因此,当您在此使用脚本中添加 2 时,2 会附加在末尾(类似于连接两个字符串)。

所以,为了解决这个问题,您可以:

  1. 创建新索引,更新 int 类型的 ElaspsedTIme 字段的映射,然后重新索引数据。然后您可以使用上述问题中给出的相同搜索查询。

  2. 使用 Integer.parseInt()

    string 转换为 int 类型值
GET /com-prod/_search
{
  "script_fields": {
    "test2": {
      "script": {
        "lang": "painless",
        "source": "Integer.parseInt(params._source.ElapsedTime) + 2"
      }
    }
  }
}