Elasticsearch return search response very quickly with timeout:true

Elasticsearch version

bin/elasticsearch --version
7.6.0

Problem
I use go-elasticsearch client query from elasticsearch.


	resp, err := client.Search(
		client.Search.WithContext(d.ctx),
		client.Search.WithIndex(index),
		client.Search.WithBody(body),
		client.Search.WithTimeout(timeout),  // 200ms
		client.Search.WithPreference(preference),
		client.Search.WithRouting(routing...),
	)

the query body is just ids query

{
  "query": {
    "ids": {
      "values": [
        "123"
      ]
    }
  },
  "size": 1
}

but the ES return empty result with timeout:true

{
  "_shards": {
    "failed": 0,
    "skipped": 0,
    "successful": 20,
    "total": 20
  },
  "hits": {
    "hits": [

    ],
    "max_score": null,
    "total": {
      "relation": "eq",
      "value": 0
    }
  },
  "timed_out": true,
  "took": 1
}

the took=1ms , and the caller time i record is also 1ms, this means the ES server give me the response in 1ms after i send the request to the server .
But the timeout i set is 200ms .
The probability of this happening is very low and cannot be reproduced

Sorry for bother you

Can anyone help me :star_struck:

I have no idea. But why are you setting such a timeout in the first place?

I'd definitely upgrade to the latest 7.17.8 version (or 8.5.3). This one is a way too old.

Thank you so much for your reply :heart:

But why are you setting such a timeout in the first place?

Because if the ES server return very slow, i will discard the results from ES

I'd definitely upgrade to the latest 7.17.8 version (or 8.5.3). This one is a way too old.

ES cluster are uniformly maintained by a dedicated team, and it is difficult to upgrade directly

I have currently escaped this issue by retry once if the response is empty and timeout=true

In which case you are basically doubling the timeout value.
Question is: why not doubling it?

I mean that setting a timeout is not going to speed up your queries.

Oh, I get what you said.
I want to say that the problem is not because of the timeout value is not enough. I set 200ms, but ES server just use 1ms and give me an empty response.

Does this happen when you don't set any timeout?

Thank you for your advice, you mean that this timeout param may have some bad effect on this problem?

I will try this way next time. Thank you!