I am using ElasticSearch 7.3, to query some documents,
I want to return only specific fields of each document in the query response,
I found that _source
can be used to achieve this,
Which I was able to do from Kibana using this query –
GET /test/_search?_source=id
{
"query": {
"match_all": {}
}
}
Returns me the correct data –
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 6,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"id" : 3
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"id" : 2
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : { }
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "4",
"_score" : 1.0,
"_source" : {
"id" : 4
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "5",
"_score" : 1.0,
"_source" : {
"id" : 5
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "6",
"_score" : 1.0,
"_source" : {
"id" : 6
}
}
]
}
}
But I am not able to achieve the same using the node client of ElasticSearch –
const { Client } = require('@elastic/elasticsearch')
const client = new Client({ node: 'http://localhost:9200' })
let searchTest = async () => {
let indexToQuery = 'test';
let esQuery = {
index: indexToQuery,
//q: '_source:id',
body: {
"query": {
"match_all": {}
}
}
};
console.log('esQuery =>\n', esQuery);
const result = await client.search(esQuery);
console.log("search resp => \n", result.body.hits.hits);
};
searchTest();
Can someone please help me find the correct way to achieve my use case?
References –
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source-filtering
https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/16.x/api-reference.html#api-search
Best Answer
_source
can also be used as a part of query. Add_source
as sibling ofquery
in the body block. Update as below: