带有json搜索体的ElasticSearch POST与使用url中的json的GET进行对比

时间:2013-01-15 14:19:16

标签: search post elasticsearch get

根据ES文档,这2个搜索请求应该得到相同的结果:

获取

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

POST

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

发帖机构:

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

但是第一个没有给出结果,而第二个给了我预期的结果。我使用ES版本0.19.10 其他人有同样的行为吗?这是一个错误吗?

3 个答案:

答案 0 :(得分:22)

根据{{​​3}}

source不是有效的查询字符串参数

Elasticsearch允许三种方式执行搜索请求......

请求正文:

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

请求正文发布:

http://www.elasticsearch.org/guide/reference/api/search/uri-request/

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

没有请求正文GET:

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

或(如果您想手动对您的查询字符串进行URL编码)

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

答案 1 :(得分:2)

您应该在第一种情况下对您的查询进行URL编码:

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

答案 2 :(得分:0)

以上答案与Elasticsearch 6.0及以上版本不兼容。ES从6.0版本开始引入了Strict Content type check。 该链接解释了它: https://www.elastic.co/blog/strict-content-type-checking-for-elasticsearch-rest-requests。 对于 curl,需要在任何具有 JSON body 的请求的命令行中添加 -H'Content-Type: application/json'