如何将具有大int列的数据导入弹性搜索?

时间:2019-04-10 19:50:12

标签: elasticsearch

我在PostgreSQL中有一个表,其中的列类型为numeric(40, 0)

我希望能够对此字段进行过滤和排序。

问题是当从PostgreSQL查询数据,然后将其转换为json,大整数值转换为“文本”,并且在弹性搜索中将被识别为“文本”类型,无法使用用于过滤和排序。

弹性搜索中的

The long type仅支持不超过10 ^ 20的整数,但我想支持不超过10 ^ 40的整数。

如何导入此类数据?

1 个答案:

答案 0 :(得分:1)

虽然我没有解决方案来增加对10十亿以上的数字的支持,但我想指出的是,在使用动态映射时,要发送的数字字符串将同时存储为text keyword数据类型。因此,如果要执行排序或过滤,则可以在keyword字段上进行操作。

例如:

PUT random_big

POST random_big/_doc
{
  "num": "10000000000000000000000000000000000000000"
}
POST random_big/_doc
{
  "num": "10000000000000000000000000000000000000001"
}
POST random_big/_doc
{
  "num": "10000000000000000001000000000000000000000"
}

检查映射(GET random_big/_mapping)显示:

{
  "random_big" : {
    "mappings" : {
      "_doc" : {
        "properties" : {
          "num" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
  }
}

排序可以如下执行:

GET random_big/_search
{
  "sort": [
    {
      "num.keyword": {
        "order": "asc"
      }
    }
  ]
}