Go 中的 Elasticsearch,错误:“客户端注意到服务器不是 Elasticsearch,我们不支持这个未知产品”

O. *_*San 14 go elasticsearch

我正在 Go 中使用 Elasticsearch,我遵循了本指南: https: //developer.okta.com/blog/2021/04/23/elasticsearch-go-developers-guide

我使用 docker 设置了 Elastic。验证 Elasticsearch 是否正在运行:

$ curl http://localhost:9200
{
  "name" : "0e9e2916eca5",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "jh8PVKNASpO3uK87Jzoq6Q",
  "version" : {
    "number" : "7.5.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "8bec50e1e0ad29dad5653712cf3bb580cd1afcdf",
    "build_date" : "2020-01-15T12:11:52.313576Z",
    "build_snapshot" : false,
    "lucene_version" : "8.3.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
Run Code Online (Sandbox Code Playgroud)

从浏览器看来也不错。

接下来,我设置了一个示例 Go 程序来测试它:

package main

import (
    "testing"
    "github.com/elastic/go-elasticsearch/v8"
)

func Test_elastic(t *testing.T) {

    es, err := elasticsearch.NewDefaultClient()
    if err != nil {
     panic(err)
    }

    res, err := es.Info()
    if err != nil {
     panic(err)
    }
    defer res.Body.Close()
}
Run Code Online (Sandbox Code Playgroud)

但 res 返回错误:

“客户注意到服务器不是 Elasticsearch,我们不支持这个未知产品”

深入研究代码,我发现它通过查找header.Get("X-Elastic-Product") == "Elasticsearch".

我不知道为什么它不起作用,而且我在网上找不到此错误的任何参考...将不胜感激对此的任何意见。

小智 18

您使用的是elasticsearch客户端的v8,但elasticsearch本身的v7.5.2。您需要使用与elasticsearch版本对应的库版本,例如github.com/elastic/go-elasticsearch/v7. 似乎最近才添加了对标头的检查,以便不使库与任何分叉一起工作。


Kam*_*san 5

添加到@izolight的答案,您可以使用任何适合您且未添加验证的旧版本。go-elasticsearchv7.13.1v6.8.10是未经产品检查的最新版本。

去.mod:

    github.com/elastic/go-elasticsearch/v7 v7.13.1
    github.com/elastic/go-elasticsearch/v6 v6.8.10
Run Code Online (Sandbox Code Playgroud)

样本.go:

    github.com/elastic/go-elasticsearch/v7 v7.13.1
    github.com/elastic/go-elasticsearch/v6 v6.8.10
Run Code Online (Sandbox Code Playgroud)

无关:

通过这样做,像 OpenSearch 这样的 Elasticsearch 分支将无法使用go-elasticsearch客户端。相同的产品检查被添加到其他客户端库,例如elastic/elasticsearch-py

作为回应,亚马逊也计划分叉客户端库并像 OpenSearch 一样维护它们。