2017-04-06 13 views
1

私は比較的新しくなっています。現在、弾性検索でレコードを検索しようとしています。これまでに作成した基本的なコードは、これまで単純な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への呼び出しを見ると、1つのパラメータ、URLがあります。動作していないサンプルでは、​​有効なURLは渡していません。あなたはカールに渡すものを渡していますが、これは同じものではありません。 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

関連する問題