为什么 elasticsearch 不允许更改索引数据?
Why doesn't elasticsearch allow changes to an indexed data?
我试图将先前索引数据中的某些字段从字符串转换为整数。但是当我再次 运行 logstash 时,字段没有被转换(仅在 Kibana 中检查)。为什么我不能对已编入索引的数据进行更改,如果不能,我如何才能对我的索引进行所需的更改?
我只是在 logstash 中进行更改。下面是一段logstash.conf:
input {
file {
type => "movie"
path => "C:/TestLogs/Test5.txt"
start_position => "beginning"
}
}
filter {
grok {
match => {"message" => "(?<Movie_Name>[\w.\-\']*)\s(?<Rating>[\d.]+)\s(?<No. Of Downloads>\d+)\s(?<No. of views>\d+)" }
}
mutate {
convert => {"Rating" => "float"}
convert => {"No. of Downloads" => "integer"}
convert => {"No. of views" => "integer"}
}
}
Elasticsearch 的核心是使用 Lucene 来索引和存储数据。 Lucene 使用只读数据结构来存储数据,这就是为什么无法更改已存储在 elasticsearch 中的数据的数据结构的原因。可以用新值更新文档,但不能更改整个索引的结构。
如果您想更改映射,即数据结构,则必须使用新映射创建新索引并将其存储在那里。
如果elasticsearch是数据的主人,这当然不是那么容易。为此,您必须使用新映射创建新索引,并从旧索引中读取数据并将其放入新索引中。您可以使用 Scan and Scroll 方法来做到这一点。
如果你想让这对从 elasticsearch 读取的应用程序透明,你可以使用别名:
最初索引名称是data_v1
,别名是data
:
data -> data_v1
然后您使用新映射创建一个新索引:data_v2
。从 data_v1
中读取所有数据并将其存储在 data_v2
中。完成此操作后,将别名更改为指向 data_v2
data -> data_v2
要更改别名,您可以使用 'remove' 和 'add' 函数:
POST /_aliases
{
"actions": [
{ "remove": {
"alias": "items",
"index": "items_v1"
}}
]
}
POST /_aliases
{
"actions": [
{ "add": {
"alias": "items",
"index": "items_v2"
}}
]
}
我试图将先前索引数据中的某些字段从字符串转换为整数。但是当我再次 运行 logstash 时,字段没有被转换(仅在 Kibana 中检查)。为什么我不能对已编入索引的数据进行更改,如果不能,我如何才能对我的索引进行所需的更改?
我只是在 logstash 中进行更改。下面是一段logstash.conf:
input {
file {
type => "movie"
path => "C:/TestLogs/Test5.txt"
start_position => "beginning"
}
}
filter {
grok {
match => {"message" => "(?<Movie_Name>[\w.\-\']*)\s(?<Rating>[\d.]+)\s(?<No. Of Downloads>\d+)\s(?<No. of views>\d+)" }
}
mutate {
convert => {"Rating" => "float"}
convert => {"No. of Downloads" => "integer"}
convert => {"No. of views" => "integer"}
}
}
Elasticsearch 的核心是使用 Lucene 来索引和存储数据。 Lucene 使用只读数据结构来存储数据,这就是为什么无法更改已存储在 elasticsearch 中的数据的数据结构的原因。可以用新值更新文档,但不能更改整个索引的结构。
如果您想更改映射,即数据结构,则必须使用新映射创建新索引并将其存储在那里。
如果elasticsearch是数据的主人,这当然不是那么容易。为此,您必须使用新映射创建新索引,并从旧索引中读取数据并将其放入新索引中。您可以使用 Scan and Scroll 方法来做到这一点。
如果你想让这对从 elasticsearch 读取的应用程序透明,你可以使用别名:
最初索引名称是data_v1
,别名是data
:
data -> data_v1
然后您使用新映射创建一个新索引:data_v2
。从 data_v1
中读取所有数据并将其存储在 data_v2
中。完成此操作后,将别名更改为指向 data_v2
data -> data_v2
要更改别名,您可以使用 'remove' 和 'add' 函数:
POST /_aliases
{
"actions": [
{ "remove": {
"alias": "items",
"index": "items_v1"
}}
]
}
POST /_aliases
{
"actions": [
{ "add": {
"alias": "items",
"index": "items_v2"
}}
]
}