将现有的字段映射转换为 geoip
Convert existing field mapping to geoip
我已经使用logstash 解析了一个日志文件并将其放入elasticsearch。我有一个名为 IP 的字段,它现在被映射为一个字符串。我想再次将 elasticsearch 中的现有映射转换为没有 运行 logstash 的 geoip。我在这个领域的弹性搜索中有几百万条记录。我想在所有记录中将 IP 从字符串映射转换为 geoip。
恐怕您仍然需要为此使用 Logstash,因为 geoip
是一个 Logstash 过滤器,而 Elasticsearch 本身无法访问 GeoIP 数据库。
不过不要害怕,您不需要在原始日志行上重新 运行 Logstash,您可以简单地使用中间的 elasticsearch
input plugin and an elasticsearch
output plugin and by tacking the geoip
filter 重新索引您的 ES 文档,以便将 IP
字段转换为 geoip
字段。
由于您无法将当前 IP
字段的映射从 string
修改为 geo_point
,我们需要确保您的索引已准备好接收 GeoIP 数据。首先使用以下命令检查您的索引是否已在映射中包含 geoip
字段(该字段将由 Logstash 使用其预定义的标准 logstash-*
模板创建)。
curl -XGET localhost:9200/logstash-xyz/_mapping
如果您在上述命令的输出中看到 geoip
字段,那么您就可以开始了。否则,我们首先需要创建类型为 geo_point
:
的 geoip
字段
curl -XPUT localhost:9200/logstash-xyz/_mapping/your_type -d '{
"your_type": {
"properties": {
"geoip": {
"type": "object",
"dynamic": true,
"properties": {
"ip": {
"type": "ip",
"doc_values": true
},
"location": {
"type": "geo_point",
"doc_values": true
},
"latitude": {
"type": "float",
"doc_values": true
},
"longitude": {
"type": "float",
"doc_values": true
}
}
}
}
}
}'
现在您的地图已准备好接收 GeoIP 数据。因此,接下来我们创建一个名为 geoip.conf
的 Logstash 配置文件,如下所示:
input {
elasticsearch {
hosts => "localhost:9200"
index => "logstash-xyz"
}
}
filter {
mutate {
remove_field => [ "@version", "@timestamp" ]
}
geoip {
source => "IP" <--- the field containing the IP string
}
}
output {
elasticsearch {
host => "localhost"
port => 9200
protocol => "http"
manage_template => false
index => "logstash-xyz"
document_id => "%{id}"
workers => 1
}
}
然后在设置正确的值(主机 + 索引)后,您可以 运行 使用 bin/logstash -f geoip.conf
。 运行完成此操作后,您的文档应包含一个名为 geoip
的新字段,其中包含 GeoIP 信息。
接下来,我建议您直接将 geoip
过滤器添加到您的普通 logstash 配置中。
我已经使用logstash 解析了一个日志文件并将其放入elasticsearch。我有一个名为 IP 的字段,它现在被映射为一个字符串。我想再次将 elasticsearch 中的现有映射转换为没有 运行 logstash 的 geoip。我在这个领域的弹性搜索中有几百万条记录。我想在所有记录中将 IP 从字符串映射转换为 geoip。
恐怕您仍然需要为此使用 Logstash,因为 geoip
是一个 Logstash 过滤器,而 Elasticsearch 本身无法访问 GeoIP 数据库。
不过不要害怕,您不需要在原始日志行上重新 运行 Logstash,您可以简单地使用中间的 elasticsearch
input plugin and an elasticsearch
output plugin and by tacking the geoip
filter 重新索引您的 ES 文档,以便将 IP
字段转换为 geoip
字段。
由于您无法将当前 IP
字段的映射从 string
修改为 geo_point
,我们需要确保您的索引已准备好接收 GeoIP 数据。首先使用以下命令检查您的索引是否已在映射中包含 geoip
字段(该字段将由 Logstash 使用其预定义的标准 logstash-*
模板创建)。
curl -XGET localhost:9200/logstash-xyz/_mapping
如果您在上述命令的输出中看到 geoip
字段,那么您就可以开始了。否则,我们首先需要创建类型为 geo_point
:
geoip
字段
curl -XPUT localhost:9200/logstash-xyz/_mapping/your_type -d '{
"your_type": {
"properties": {
"geoip": {
"type": "object",
"dynamic": true,
"properties": {
"ip": {
"type": "ip",
"doc_values": true
},
"location": {
"type": "geo_point",
"doc_values": true
},
"latitude": {
"type": "float",
"doc_values": true
},
"longitude": {
"type": "float",
"doc_values": true
}
}
}
}
}
}'
现在您的地图已准备好接收 GeoIP 数据。因此,接下来我们创建一个名为 geoip.conf
的 Logstash 配置文件,如下所示:
input {
elasticsearch {
hosts => "localhost:9200"
index => "logstash-xyz"
}
}
filter {
mutate {
remove_field => [ "@version", "@timestamp" ]
}
geoip {
source => "IP" <--- the field containing the IP string
}
}
output {
elasticsearch {
host => "localhost"
port => 9200
protocol => "http"
manage_template => false
index => "logstash-xyz"
document_id => "%{id}"
workers => 1
}
}
然后在设置正确的值(主机 + 索引)后,您可以 运行 使用 bin/logstash -f geoip.conf
。 运行完成此操作后,您的文档应包含一个名为 geoip
的新字段,其中包含 GeoIP 信息。
接下来,我建议您直接将 geoip
过滤器添加到您的普通 logstash 配置中。