ElasticSearch POST with json search body vs GET wi

2019-03-24 20:16发布

问题:

According to the ES documentation, those 2 search request should get the same results:

GET

http://localhost:9200/app/users/_search?source={"query": {"term": {"email":"foo@gmail.com"}}}

POST

http://localhost:9200/app/users/_search

Post body :

{
    "query":  {
         "term": {
               "email":"foo@gmail.com"
          }
    }
}

But the first one gives no result while the second one gives me the expected result. I use ES version 0.19.10 Did anybody else have the same behavior ? Is this a bug ?

回答1:

source is not a valid query string argument according to http://www.elasticsearch.org/guide/reference/api/search/uri-request/

Elasticsearch allows three ways to perform a search request...

GET with request body:

curl -XGET "http://localhost:9200/app/users/_search" -d '{
  "query": {
    "term": {
      "email": "foo@gmail.com"
    }
  }
}'

POST with request body:

Since not all clients support GET with body, POST is allowed as well.

curl -XPOST "http://localhost:9200/app/users/_search" -d '{
  "query": {
    "term": {
      "email": "foo@gmail.com"
    }
  }
}'

GET without request body:

curl -XGET "http://localhost:9200/app/users/_search?q=email:foo@gmail.com"

or (if you want to manually URL encode your query string)

curl -XGET "http://localhost:9200/app/users/_search?q=email%3Afoo%40gmail.com"


回答2:

You should URL encode your query in the first case:

http://localhost:9200/app/users/_search?source=%7b%22query%22%3a+%7b%22term%22%3a+%7b%22email%22%3a%22foo%40gmail.com%22%7d%7d%7d