public <T> Mono<SearchResponse<T>> search(
            String index,
            SearchRequest request,
            ObjectReader reader) {
        HttpClient.ResponseReceiver<?> send = httpClient.request(HttpMethod.GET)
                .uri("/"
                        + index
                        + "/_search")
                .send(Mono.fromCallable(() -> JsonUtil.write(request)));
        return parseResponse(send, inputStream -> {
            try {
                return reader.readValue(inputStream);
            } catch (IOException e) {
                throw new InputOutputException("Failed to parse the result", e);
            }
        });
    }
@author James Chen
@implNote Don't use the Elasticsearch official implementation because:
          <p>
          1. Its jar (elasticsearch-java:8.13.0 is 11.2 MB) is unnecessarily large for our use
          cases.
          <p>
          2. Our implementation is more concise and efficient.
turms-service/src/main/java/im/turms/service/storage/elasticsearch/ElasticsearchClient.java