我知道可以在别名中定义两个索引,其中一个索引具有以下特性 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_2
其具有 is_write_index
设为 false
当我把数据写到 test_index_1
,而不是从两个索引中读取,这是默认的行为。意思是说,我不希望搜索结果来自于索引中的 is_write_index
设置为 true
.
这可能吗?我试过设置 index.blocks.read
到 true
的写索引上,但是在别名上的搜索查询就会以异常的方式失败。相反,我希望在别名上的读取查询只从那个有 is_write_index
设为 false
.
我如何才能实现这个目标?
你使用这个功能的方式不正确。如果你使用别名进行搜索,它将总是试图读取所有的底层索引。is_write_index 是作为支持滚动和索引模式的功能提供的,其中写入发生在一个索引上,但读取发生在具有相同别名或索引模式的所有索引上。
如果你的意图是将数据加载到一个索引中,但允许应用程序继续从旧索引中读取数据,当数据加载进行时,你应该使用2个独立的别名--一个用于读,一个用于写,并在数据加载完成后设置一个策略来交换指向索引的别名。
这可以通过使用 过滤后的别名.
你这样做的方法是你应用一个自定义的过滤器,同时向别名添加写索引。在别名中添加写索引时,应用自定义过滤器。filter
属性定义了 bool
条件的基础上,在这个索引上过滤数据,并在这个索引中以数据集的新视图的形式呈现。所有对这个索引的搜索查询都发生在Elastic创建的这个新视图上。因此,如果你想避免从你当前写入的索引中读取数据,可以在数据集中的任何文档中应用一个永不满足的过滤器或一个 exists
过滤器的某个虚字段。
POST /_aliases
{
"actions": [
{
"add": {
"index": "test_index_2",
"alias": "my_alias",
"is_write_index": true,
"filter": {
"bool": {
"must_not": {
"exists": {
"field": "<field_that_always_exists_in_your_documents>"
}
}
}
}
}
}
]
}
写完数据后,更新别名,去掉上面的 filter
属性,允许从两个索引中读取。