用curl在elasticsearch中查询和查询

g.l*_*lou 8 lucene curl elasticsearch

让我们在Elasticsearch中注入一些数据

curl -XPUT 'localhost:9200/customer/external/1' -d '{ "author": "John", "published_from":"2016-08-03" }'
curl -XPUT 'localhost:9200/customer/external/2' -d '{ "author": "Jeanne", "published_from":"2016-08-03" }'
curl -XPUT 'localhost:9200/customer/external/3' -d '{ "author": "Jean", "published_from":"2016-08-05" }'
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用published_from = 2016-08-03和author = John查询文档.我试着用这个curl命令做到这一点:

curl -g "localhost:9200/customer/external/_search?pretty&filter_path=hits.hits._source.author&q=+author:John+published_from:2016-08-03"
Run Code Online (Sandbox Code Playgroud)

然而,输出显示珍妮

{
  "hits" : {
    "hits" : [
      {
        "_source" : {
          "author" : "John"
        }
      },
      {
        "_source" : {
          "author" : "Jeanne"
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这个curl命令时:

curl "localhost:9200/customer/external/_search?pretty&filter_path=hits.hits._source.author&q=%2Bauthor%3AJohn+%2Bpublished_from%3A2016-08-03"
Run Code Online (Sandbox Code Playgroud)

输出正是我想要的.

{
  "hits" : {
    "hits" : [
      {
        "_source" : {
          "author" : "John"
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么第一个命令没有按预期工作?

ran*_*mir 2

第一个 URL 中的+标志

...&q=+author:John+published_from:2016-08-03
Run Code Online (Sandbox Code Playgroud)

根据百分比编码规则(在服务器端)解释为空格。空格通常被编码为%20,但由于历史原因,+也是空格字符的有效编码。

这意味着 ElasticSearch 获取的查询字符串如下所示:

author:John published_from:2016-08-03
Run Code Online (Sandbox Code Playgroud)

根据查询字符串语法,它将查找任何包含一个或多个author:John或的文档published_from:2016-08-03

当您正确编码 Elastic 的+运算符(在第二个 URL 中)时,收到的查询为:

+author:John +published_from:2016-08-03
Run Code Online (Sandbox Code Playgroud)

请注意+被解码为空格和。%2B+

简单查询参数编码curl

为了避免对查询进行手动(百分比)编码,您可以使用该--data-urlencode选项并提供原始key=value对。

例如:

curl -G 'localhost:9200/customer/external/_search?pretty&filter_path=hits.hits._source.author' --data-urlencode 'q=+author:John +published_from:2016-08-03'
Run Code Online (Sandbox Code Playgroud)

这里curl将把 URL 中的查询参数与-d/--data-urlencode选项提供的查询参数结合起来。我们需要-G强制GET请求,因为-d/--data-urlencode默认为POST请求。