Over the last few years I have done a lot of development against Elasticsearch, especially using the Ruby libraries. The Elasticsearch::DSL is very powerful, but anything beyond a simple query can take hours of debugging to get the syntax just right. I always learn the hard way that it is better to handcraft the JSON first to get the logic correct, and then translate it to the Ruby DSL code.

I don’t do it often enough to remember, so after my latest struggle with ES, I thought it useful to document.

The curl command is:

curl -X POST localhost:9200/myindex/_search \
-H 'Content-Type: application/json' -s \
-d '@q-test.json' | json_xs  | jq .hits.total

where q-test.json is a file with the DSL JSON.