elasticsearch,go,get,Curl,elasticsearch,Go,Get" /> elasticsearch,go,get,Curl,elasticsearch,Go,Get" />

Curl 用Golang搜索弹性搜索

Curl 用Golang搜索弹性搜索,curl,elasticsearch,go,get,Curl,elasticsearch,Go,Get,我是一个新手,目前正在尝试使用弹性搜索搜索记录,下面是我创建的基本代码,到目前为止,我能够执行一个简单的GET请求“”,并按预期返回结果。然而,一旦我尝试运行稍微复杂一点的GET请求,它就会失败 下面是我迄今为止创建的代码 package main import ( "fmt" "io/ioutil" "net/http" ) func main() { //request, err := http.Get(`http://10.132.0.13:9200/`) // this

我是一个新手,目前正在尝试使用弹性搜索搜索记录,下面是我创建的基本代码,到目前为止,我能够执行一个简单的GET请求“”,并按预期返回结果。然而,一旦我尝试运行稍微复杂一点的GET请求,它就会失败

下面是我迄今为止创建的代码

package main

import (
 "fmt"

 "io/ioutil"
 "net/http"
)

func main() {

 //request, err := http.Get(`http://10.132.0.13:9200/`) // this just returns the test page

 request, err := http.Get(`http://10.132.0.13:9200/database-*/_search?pretty -d { "query": { "match": {"_all": "searchterm"}}}`)

 if err != nil {
  //error
 }
 defer request.Body.Close()

 body, err := ioutil.ReadAll(request.Body)

 fmt.Println(string(body))

}
我可以使用curl-xget直接查询索引,它返回预期的结果


有没有一种方法可以在golang中实现类似的curl-xget?

您可以尝试类似的方法。提交JSON数据(或表单数据),这意味着您可能应该使用POST或PUT。XGET覆盖GET请求的默认行为。使用curl切换到POST,看看您的查询是否仍然有效

package main

import (
    "bytes"
    "fmt"

    "io/ioutil"
    "net/http"
)

func main() {
    query := []byte(`{"query": { "match": {"_all": "searchterm"}}}`)
    req, err := http.NewRequest("POST", "http://10.132.0.13:9200/database-*/_search?pretty", bytes.NewBuffer(query))
    if err != nil {
        panic(err)
    }
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(body))

}

要将主体数据传递给get请求,必须以稍微不同的方式构造请求对象:

requestBody := `{ "query": { "match": {"_all": "searchterm"}}}`
// convert string to reader
requestReader := bytes.NewReader([]byte(requestBody))
// construct the request object
request, err := http.NewRequest("GET", `http://10.132.0.13:9200/database-*/_search?pretty`, requestReader)
// send the request using default client
response, err := http.DefaultClient.Do(request)

if err != nil {
    panic(err)
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)

fmt.Println(string(body))
如果您必须使用更复杂的弹性查询,那么使用go客户端可能是有意义的,例如:


但是根据您的用例,使用http.Request更好。

Get请求通常不会提交数据。发布和放置请求。尽管发送带有GET请求的正文并不常见,但它是完全有效的,没有理由不这样做。如果您只读取数据而不更改/添加数据,那么GET是正确的选择,而POST则是错误的。Elastic使用GET进行查询,对于更复杂的查询,它使用来自GET请求主体的数据。如果查看对http.GET的调用,它有一个参数,URL。在非工作示例中,您没有传递有效的URL;你在传递你将传递给curl的东西,这不是一回事。URL没有类似于
-d
的标志。Christian,此方法非常有效。谢谢您的帮助,我会查看一下您的SuggestedRecentRoot,谢谢您的帮助。此解决方案也没有任何问题。@FrankJ没问题,很乐意提供帮助。