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

dm7nw8vv  于 2023-03-17  发布在  ElasticSearch
关注(0)|答案(2)|浏览(113)

我知道可以在别名中定义两个索引,其中一个索引将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_1写入数据时,搜索只发生在test_index_2上,test_index_2is_write_index设置为false,而不是从两个索引中阅读,这是默认行为。我不希望搜索结果来自is_write_index设置为true的索引。
这可能吗?我试过在写索引上将index.blocks.read设置为true,但是在别名上的搜索查询失败,出现了一个异常。相反,我希望别名查询只从is_write_index设置为false的索引读取。
我怎样才能做到这一点?

b5buobof

b5buobof1#

这可以通过过滤别名来实现。
执行此操作的方法是在将写入索引添加到别名时应用自定义筛选器。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属性更新别名,以允许从两个索引读取数据。

htrmnn0y

htrmnn0y2#

您使用此功能的方式不正确。如果您使用别名进行搜索,它将始终尝试读取所有基础索引。is_write_index是作为支持滚动和索引模式的功能提供的,其中写入发生在1个索引上,但读取发生在具有相同别名或索引模式的所有索引上。
如果您的目的是将数据加载到一个索引中,但允许应用程序继续从旧索引中读取,则当数据加载进行时,您应该使用2个单独的别名-一个用于读取,一个用于写入,并在数据加载完成后,使用一种策略来交换指向索引的别名。

相关问题