2015-11-04 21 views
0

我通過這裏傳遞一些參數來限制查詢結果,並且query_string在url中傳遞。雖然,我也給了請求主體來過濾結果。如何在同一時間使用body和GET參數?

curl -XGET 'http://localhost:9200/books/fantasy/_search?from=0&size=10&q=%2A' -d '{ 
    "query":{ 
     "filtered":{ 
      "filter":{ 
       "exists":{ 
        "field":"speacial.ean" 
       } 
      } 
     } 
    } 
}' 

我只是想檢查是這種方法好嗎?有沒有這樣做的缺點?或者當我使用body的時候,我應該在URL中傳遞任何參數?

這似乎工作,但這是不好的做法?

+0

問題是GET請求不使用主體(即它沒有主體)。當您使用GET方法時,curl可能會將-d數據轉換爲url參數。你可以在服務器日誌中檢查這個嗎? –

+0

你確定嗎? 「HTTP GET和HTTP POST都可以用來執行搜索,因爲並非所有的客戶端都支持GET,所以POST也是允許的。」 - https://www.elastic.co/guide/en/elasticsearch/reference/1.3/search-request-body.html – lehtu

+0

同樣值得注意的是,Sense這樣的工具會給出警告:'瀏覽器不支持GET請求。這將作爲POST'執行,並在發送有效負載時靜默地將GET轉換爲POST。 ES端點同時接受,但正確的HTTP方式是從不用GET發送一個有效載荷......當我這樣做時發現了一些奇怪的錯誤,並且調試它們並不總是直截了當的。 – Val

回答

0

GET請求不應該使用正文(有關此here的更多信息)。雖然curl可能會將您的GET請求與正文轉換爲POST,但許多工具可能會簡單地刪除正文,或者可能會將其發送給Elastic,但由於您使用了GET而被忽略。

當執行在我的感覺這個查詢,我得到的所有的文件,而不是僅僅文檔覈對我的查詢,證明身體已被忽略:

GET myIndex/_search 
{ 
    "query": { 
     "match": { 
      "zlob": true 
     } 
    } 
} 

這個例子表明,你應該避免使用GET使用正文發出請求,因爲結果取決於您用於休息查詢的工具。