Запрос, сгенерированный API SQL Translate, выглядит так:
{
"size" : 1000,
"query" : {
"term" : {
"name.keyword" : {
"value" : "Object_1",
"boost" : 1.0
}
}
},
"_source" : {
"includes" : [
"name"
],
"excludes" : [ ]
},
"docvalue_fields" : [
{
"field" : "id"
},
{
"field" : "timestamp",
"format" : "epoch_millis"
}
],
"sort" : [
{
"_doc" : {
"order" : "asc"
}
}
]
}
Важно отметить, что фильтрация источника выполняется для возврата только поля name
в документе _source
с id
и timestamp
возвращается из docvalue_fields
. Чтобы получить их из ответа на поиск, вам нужно будет извлечь их из fields
для каждого попадания
var resp = client.LowLevel.Search<SearchResponse<EsObject>>(indexName, sqlResponse.Body);
var documents = resp.Hits
.Select(h => {
h.Source.Id = h.Fields.ValueOf<EsObject, int>(f => f.Id);
h.Source.Timestamp = DateTimeOffset.FromUnixTimeMilliseconds(long.Parse(h.Fields.Value<string>("timestamp"))).DateTime;
return h.Source;
})
.ToList();
для справки, вот ответ на поиск JSON
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "es_objects",
"_type" : "_doc",
"_id" : "1",
"_score" : null,
"_source" : {
"name" : "Object_1"
},
"fields" : {
"id" : [
1
],
"timestamp" : [
"1581483319000"
]
},
"sort" : [
0
]
}
]
}
}
поисковый запрос, который сделает то, что вы хотите
var resp = client.Search<EsObject>(s => s
.Query(q => q
.Term(f => f.Name.Suffix("keyword"), obj.Name)
)
.Sort(s => s.Ascending(SortSpecialField.DocumentIndexOrder))
);
var documents = resp.Documents.ToList();