Logstash - 如何更改字段类型

Logstash - how to change field types

大家好,我是 Elasticsearch 的新手,我有一个名为 'american_football_sacks_against_stats' 的 table。它由三列组成。

id sacks_against_total sacks_against_yards
1 12 5
2 15 3
... ... ...

问题是 sacks_against_total 和 sacks_against_yards 不是 'imported' 和 integers/longs/floats 一样,而是文本字段和关键字字段。如何将它们转换成数字?

我试过了,但没用:

mutate {
        convert => {
             "id" => "integer"
             "sacks_against_total" => "integer"
             "sacks_against_yards" => "integer"
        } 
    }

这是我的 logstash.conf 文件:

input {
    jdbc {
        jdbc_connection_string => "jdbc:postgresql://localhost:5432/sportsdb"
        jdbc_user => "user"
        jdbc_password => "password"
        jdbc_driver_class => "org.postgresql.Driver"
        schedule => "*/5 * * * *" 
        statement => "SELECT * FROM public.american_football_sacks_against_stats"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "300"
    }
}

filter {
    mutate {
        convert => {
             "id" => "integer"
             "sacks_against_total" => "integer"
             "sacks_against_yards" => "integer"
        } 
    }
}

output {
    stdout { codec => "json" }
    elasticsearch {
        hosts => "http://localhost:9200"
        index => "sportsdb"
        doc_as_upsert => true #
    }
}

Elasticsearch 不提供更改现有字段类型的功能。

您可以在此处阅读一些选项: https://medium.com/@max.borysov/change-field-type-in-elasticsearch-index-2d11bb366517

这是我一直在寻找的解决方案: https://linuxhint.com/elasticsearch-reindex-change-field-type/

首先,您从索引创建输入并更改类型。

PUT _ingest/pipeline/convert_pipeline
{
  “description”: “converts the field sacks_against_total,sacks_against_yards fields to a long from string”,
  "processors" : [
    {
      "convert" : {
        "field" : "sacks_against_yards",
        "type": "long"
      }
    }, 
    {
      "convert" : {
        "field" : "sacks_against_total",
        "type": "long"
      }
    }
  ]
}

或在 cURL 中:

curl -XPUT "http://localhost:9200/_ingest/pipeline/convert_pipeline" -H 'Content-Type: application/json' -d'{  "description": "converts the sacks_against_total field to a long from string",  "processors" : [    {      "convert" : {        "field" : "sacks_against_total",        "type": "long"      }    }, {"convert" : {        "field" : "sacks_against_yards",        "type": "long"     } }  ]}'

然后将索引重新索引到另一个索引

POST _reindex
{
  “source”: {
    "index": "american_football_sacks_against_stats"
  },
  "dest": {
    "index": "american_football_sacks_against_stats_withLong",
    "pipeline": "convert_pipeline"
  }
}

或在 cURL 中:

curl -XPOST "http://localhost:9200/_reindex" -H 'Content-Type: application/json' -d'{  "source": {    "index": "sportsdb"  },  "dest": {    "index": "sportsdb_finish",    "pipeline": "convert_pipeline"  }}'