在ElasticSearch 7.6中搜索别名时,如何只从一个索引读取,而将另一个索引设置为写?

问题描述 投票:0回答:1

我知道可以在别名中定义两个索引,其中一个索引具有以下特性 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_1test_index_2 其中第一个是写索引,而第二个不是。

现在,我希望能够查询到 my_alias 的方式,使搜索只发生在 test_index_2 其具有 is_write_index 设为 false 当我把数据写到 test_index_1,而不是从两个索引中读取,这是默认的行为。意思是说,我不希望搜索结果来自于索引中的 is_write_index 设置为 true.

这可能吗?我试过设置 index.blocks.readtrue 的写索引上,但是在别名上的搜索查询就会以异常的方式失败。相反,我希望在别名上的读取查询只从那个有 is_write_index 设为 false.

我如何才能实现这个目标?

elasticsearch
1个回答
0
投票

你使用这个功能的方式不正确。如果你使用别名进行搜索,它将总是试图读取所有的底层索引。is_write_index 是作为支持滚动和索引模式的功能提供的,其中写入发生在一个索引上,但读取发生在具有相同别名或索引模式的所有索引上。

如果你的意图是将数据加载到一个索引中,但允许应用程序继续从旧索引中读取数据,当数据加载进行时,你应该使用2个独立的别名--一个用于读,一个用于写,并在数据加载完成后设置一个策略来交换指向索引的别名。


0
投票

这可以通过使用 过滤后的别名.

你这样做的方法是你应用一个自定义的过滤器,同时向别名添加写索引。在别名中添加写索引时,应用自定义过滤器。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 属性,允许从两个索引中读取。

© www.soinside.com 2019 - 2024. All rights reserved.