用curl在elasticsearch中查询和查询

时间:2017-10-20 12:37:43

标签: curl elasticsearch lucene

让我们在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" }'

我正在尝试使用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"

然而,输出显示Jeanne

{
  "hits" : {
    "hits" : [
      {
        "_source" : {
          "author" : "John"
        }
      },
      {
        "_source" : {
          "author" : "Jeanne"
        }
      }
    ]
  }
}

当我尝试这个curl命令时:

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

输出正是我想要的。

{
  "hits" : {
    "hits" : [
      {
        "_source" : {
          "author" : "John"
        }
      }
    ]
  }
}

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

1 个答案:

答案 0 :(得分:2)

第一个网址中的 +标志

...&q=+author:John+published_from:2016-08-03
根据{{​​3}}规则作为空格

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

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

author:John published_from:2016-08-03

根据percent-encoding,它会找到包含author:Johnpublished_from:2016-08-03中的一个或多个的任何文档。

正确编码Elastic的+运算符(在第二个网址中)时,收到的查询是:

+author:John +published_from:2016-08-03

请注意,+已解码为空格%2B已解码为+

curl

中的简单查询参数编码

为避免手动(百分比)编码查询,您可以使用query string syntax选项,并提供原始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'

此处curl会将网址中的查询参数与-d / --data-urlencode选项提供的参数相结合。我们需要-G强制GET请求,因为-d / --data-urlencode默认为POST请求。