2017-04-06 103 views
1

我對Go比較陌生,目前我試圖在彈性搜索中搜索記錄,下面是我創建的基本代碼,到目前爲止我能夠執行一個簡單的GET請求「http://10.132.0.13:9200/ 「並按預期返回結果。但是,一旦我嘗試運行稍微複雜的GET請求,它就會失敗。用Golang搜索Elasticsearch

以下是我迄今爲止創建的代碼。

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)) 

} 

我可以使用捲曲-xget直接查詢索引,並返回預期的結果

有沒有實現golang類似的捲曲-xget的方法嗎?

+0

獲取請求通常不會提交數據。郵政和放置請求。 http://stackoverflow.com/questions/8498371/curl-get-and-x-get – reticentroot

+0

儘管用GET請求發送主體並不常見,但它是完全有效的,沒有理由不這樣做。如果您只讀取數據並且不更改/添加數據GET是正確的選擇,而POST將是錯誤的。 Elastic使用GET進行查詢,對於更復雜的查詢,它使用來自GET請求主體的數據。 – Christian

+0

如果你看看你對http.Get的調用,它有一個參數,URL。在您的非工作示例中,您未傳遞有效的網址;你傳遞了你會傳遞給捲曲的東西,這不是一回事。網址沒有像「-d」這樣的標誌。 – Adrian

回答

1

你可以嘗試這樣的事情。您提交的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)) 

} 
+0

reticentroot,感謝您的幫助,這個解決方案也沒有任何問題。 – FrankJ

+0

@FrankJ沒問題,樂意幫忙。 – reticentroot

1

以體數據傳遞給你來構建你的請求對象有點不同的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)) 

如果必須使用更復雜的彈性查詢,它可能是有意義的使用一展身手客戶端,例如:http://olivere.github.io/elastic/

但取決於您的用例,使用http.Request更好。

+0

基督徒,這種方法完美謝謝你的幫助生病看看http://olivere.github.io/elastic/你的建議 – FrankJ