Curl 用Golang搜索弹性搜索
我是一个新手,目前正在尝试使用弹性搜索搜索记录,下面是我创建的基本代码,到目前为止,我能够执行一个简单的GET请求“”,并按预期返回结果。然而,一旦我尝试运行稍微复杂一点的GET请求,它就会失败 下面是我迄今为止创建的代码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
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没问题,很乐意提供帮助。