如何在 Elasticsearch Java API 客户端中禁用兼容性标头?

分享于2022年07月17日 elasticsearch elasticsearch-java-api java kotlin 问答
【问题标题】:如何在 Elasticsearch Java API 客户端中禁用兼容性标头?(How to disable compatibility header in Elasticsearch Java API Client?)
【发布时间】:2022-01-17 10:05:52
【问题描述】:

我正在尝试将我的应用程序配置为使用 Java API Client v7.16.3 与 Elastcisearch 服务器 v7.7 交互。但是当我尝试索引新文档时,出现以下错误:

{"error":"Content-Type header [application/vnd.elasticsearch+json; compatible-with=7] is not supported","status":406}

据我了解,原因是 compatibility Content-type header 的值包含 compatible-with=7 。 Elasticsearch v7.7 不支持这种内容类型(而 Elasticsearch v7.15 可以很好地使用它)。这是我的配置:

    fun configElasticsearchRestClient(
        host: String,
        username: String,
        password: String
    ): ElasticsearchClient {
        val elasticsearchRestClient =  RestClient.builder(HttpHost.create(host))
            .build()
        val transport: ElasticsearchTransport = RestClientTransport(
            elasticsearchRestClient,
            JacksonJsonpMapper()
        )
        return ElasticsearchClient(transport)
    }

这里是索引方法:

    fun index(document: SomeDocument) {
        val indexRequest = IndexRequest.Builder()
            .index("some-index")
            .document(document)
            .id(document.getId())
            .version(document.getVersion())
            .versionType(External)
            .build()

        elasticsearchClient.index(indexRequest)
    }

是否可以禁用 Java API 客户端的兼容性标头? 或者还有其他方法可以使用 Java API Client for Elasticsearch server v7.7?


【解决方案1】:

您应该始终使用与服务器版本兼容的客户端库版本。在这种情况下,您使用的是最新版本的客户端库(即 7.16.3)和旧版本的服务器(即 7.7),您不应该这样做,或者您应该 expect some backward incompatibility issues :

客户端必须与集群中的节点具有相同的主要版本(例如 2.x 或 5.x)。客户端可以连接到具有不同次要版本(例如 2.3.x)的集群,但 可能不支持新功能。 理想情况下,客户端应该与集群具有相同的版本。< /p>

如果您改用 Java client 7.7 ,则不会有任何问题。

此外,从最新的 Java Client source code 可以看出, compatible-with 值被硬编码到 HTTP 标头值中。如果发现一个 header 没有那个兼容性检查,那就是 modified automatically 包含它,所以没有办法关闭它。

  • 感谢您的解释!我了解当我使用客户端 v7.16 和服务器 v7.7 时,我无法使用客户端的所有功能。但是我希望能够使用7.7版本的所有功能,因为服务器和客户端的主要版本是相同的。
  • 是的,除了兼容性检查妨碍了