'验证失败:1:[索引]不能与时间点一起使用;'}]

blu*_*sky 1 python elasticsearch

按照本指南(https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html),我创建了一个 PIT ID 并使用该 ID 尝试使用以下查询对搜索结果进行分页:

start_date = '2020-03-11T00:00:00Z'
end_date = '2021-10-30T00:00:00Z'

start_date = datetime.datetime.strptime(start_date, "%Y-%m-%dT%H:%M:%SZ")
end_date = datetime.datetime.strptime(end_date, "%Y-%m-%dT%H:%M:%SZ")

search_param = {
                "size": 10000,
                "query": {

                    "bool": {
                        "must": [
                            {"range": {"ts": {"gte": start_date, "lt": end_date}}}
                        ],
                        "should": [
                            {"exists": {"field": "data.test1"}},
                            {"exists": {"field": "data.test2"}},
                            {"exists": {"field": "data.test3"}}
                        ],
                        "minimum_should_match": 1
                    }
                },
        "pit": {
        "id": "0_uxAwILMTQxMV9ldmVudHMWTFhXQ3NrYWNSRDZMVlJzMlhPbjZVZwAWaEZZNUVOUF9SdTY5V0tMTzZyaEVtdwAAAAAAAA2Q6xZaeFkycDRKWVNxYXo0b252cXBLREtRCzE0MTFfZXZlbnRzFkxYV0Nza2FjUkQ2TFZSczJYT242VWcBFkMycTFXRmh2U3pDWXlPTXJtVlJUVWcAAAAAAAAs7BwWYmExNFdBNE9Sb1NNcklWNGgydURfUQEWTFhXQ3NrYWNSRDZMVlJzMlhPbjZVZwAA",
        "keep_alive": "1m"
            },
                "sort": [
                    {"ts": "asc"}
                ]
            }
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令调用查询:

result = elastic_connector.search(index="data_store", body=search_param, ignore=[400, 404])
print('result' , result)
Run Code Online (Sandbox Code Playgroud)

打印的结果是:

result {'error': {'root_cause': [{'type': 'action_request_validation_exception', 'reason': 'Validation Failed: 1: [indices] cannot be used with point in time;'}], 'type': 'action_request_validation_exception', 'reason': 'Validation Failed: 1: [indices] cannot be used with point in time;'}, 'status': 400}
Run Code Online (Sandbox Code Playgroud)

我正在使用 elasticsearch 7.11 。这里有一个有些相关的问题: https: //github.com/elastic/elasticsearch/issues/69974,但我不确定同样的问题是否适用于此。

我应该如何构建查询来接受 PIT 参数?

Mar*_*kus 9

来自文档:

如果提供坑,就不能<target>在请求路径中指定a。[ 1 ]

带有pit参数的搜索请求不能指定索引、路由和首选项,因为这些参数是从时间点复制的。[ 2 ]

因此,使用索引信息创建 PIT 并在不使用索引信息的情况下使用它。

  • @blue-sky,根据我的理解,当您请求给定索引的 PIT-ID 时,ES 会为此索引显式创建一个 PIT 上下文。如果在后续查询中使用 PIT-ID,ES 已经知道它是为哪个索引创建的。请记住,PIT 上下文是暂时的,您必须使其保持活动状态。 (2认同)