我知道可以在别名中定义两个索引,其中一个索引将is_write_index
设置为true
,而另一个将其设置为false -
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test_index_1",
"alias" : "my_alias",
"is_write_index": true
}
}
]
}
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test_index_2",
"alias" : "my_alias",
"is_write_index": false
}
}
]
}
如您所见,我定义了两个索引test_index_1
和test_index_2
,其中第一个是写索引,而第二个不是。
现在,我希望能够以这样一种方式查询my_alias
,即当我向test_index_1
写入数据时,搜索只发生在test_index_2
上,test_index_2
将is_write_index
设置为false
,而不是从两个索引中阅读,这是默认行为。我不希望搜索结果来自is_write_index
设置为true
的索引。
这可能吗?我试过在写索引上将index.blocks.read
设置为true
,但是在别名上的搜索查询失败,出现了一个异常。相反,我希望别名查询只从is_write_index
设置为false
的索引读取。
我怎样才能做到这一点?
2条答案
按热度按时间b5buobof1#
这可以通过过滤别名来实现。
执行此操作的方法是在将写入索引添加到别名时应用自定义筛选器。
filter
属性定义bool
条件,基于该条件在此索引上筛选数据并在此索引中显示为数据集的新视图。此索引上的所有搜索查询都在Elastic创建的此新视图上发生。因此,如果您想避免从当前写入的索引中阅读,请在数据集中的任何文档上应用一个永远无法满足的过滤器,或者在某个空字段上应用一个exists
过滤器。写入数据后,通过删除
filter
属性更新别名,以允许从两个索引读取数据。htrmnn0y2#
您使用此功能的方式不正确。如果您使用别名进行搜索,它将始终尝试读取所有基础索引。is_write_index是作为支持滚动和索引模式的功能提供的,其中写入发生在1个索引上,但读取发生在具有相同别名或索引模式的所有索引上。
如果您的目的是将数据加载到一个索引中,但允许应用程序继续从旧索引中读取,则当数据加载进行时,您应该使用2个单独的别名-一个用于读取,一个用于写入,并在数据加载完成后,使用一种策略来交换指向索引的别名。