Спасибо большое за все подсказки !
в итоге у мения получилось следуьщее query
{
"aggs": {
"groupId": {
"aggs": {
"current_score": {
"max": {
"script": {
"inline": "_score"
}
}
}
},
"terms": {
"field": "documentId",
"order": [
{
"current_score": "desc"
}
],
"size": 10
}
},
"totalDistinct": {
"cardinality": {
"field": "documentId"
}
}
},
"from": 0,
"query": {
"has_parent": {
"query": {
"function_score": {
"functions": [
{
"script_score": {
"script": {
"inline": "doc['dateOfBirth'].value",
"lang": "groovy"
}
}
}
],
"query": {
"bool": {
"must": [
{
"bool": {
"minimum_should_match": 1,
"should": [
{
"query_string": {
"boost": 2,
"fields": [
"name"
],
"lenient": true,
"query": "*Paulina Cruz*"
}
},
{
"query_string": {
"fields": [
"name.keyword"
],
"lenient": true,
"query": "*Paulina Cruz*"
}
}
]
}
},
{
"bool": {
"must": [
{
"exists": {
"field": "id"
}
}
]
}
}
]
}
}
}
},
"score": true,
"type": "persontype"
}
},
"_source": {
"excludes": [
"*"
]
}
}
query для нахождения общего количества элементов
{
"aggs": {
"totalDistinct": {
"cardinality": {
"field": "documentId"
}
}
},
"query": {
"has_parent": {
"query": {
"bool": {
"must": [
{
"exists": {
"field": "id"
}
}
]
}
},
"type": "persontype"
}
},
"_source": {
"excludes": [
"*"
]
}
}
C# версия
body
.Index(_type.GetIndexName())
.Source(src => src.ExcludeAll())
.Query(q => q.HasParent<PersonType>(
p => p
.Score(true)
.Query(qqq => qqq
.FunctionScore(fs => fs
.Query(qq => qq.Bool(b => b
.Filter(permissionContainer, personFilter)
.Must(queryContainers.ToArray())))
.Functions(fct => fct
.ScriptScore(ss => ss
.Script(cs => cs
.Inline(_descriptors.GetOrderScript(parameters.Sort))
.Lang(ScriptLang.Groovy))
))))));
body.Aggregations(
aggs => aggs
.Terms("groupId", gr => gr
.Field(f => f.DocumentId)
.Order(
new TermsOrder
{
Key = "current_score",
Order = parameters.Sort.Order == Order.ASC
? appliedSort ? SortOrder.Ascending : SortOrder.Descending
: SortOrder.Descending
})
.Size(parameters.Start + parameters.Length)
.Aggregations(
aggss => aggss
.Max("current_score", tt => tt.Script("_score"))))
.Cardinality("totalDistinct", c => c.Field(f => f.DocumentId))
);
body.From(0);
return body;
т.к. используем вегсию 5,5 многие aggregations для нас недоступны. поэтому для pagination я брала все элементы (parameters.Start + parameters.Length
) и потом из них выбирала последние.
var response = Query(parameters, user, applyPermissions, flags);
return new SearchResult<long>
{
Items = (response.Aggregations["groupId"] as BucketAggregate)?
.Items
.Cast<KeyedBucket<object>>()
.Select(bucket => long.Parse(bucket.KeyAsString ?? bucket.Key.ToString()))
.Skip(parameters.Start)
.ToList(),
ItemsCount = (long?)((ValueAggregate)response.Aggregations["totalDistinct"])?.Value ?? 0,
TotalCount = CountByType(user, applyPermissions, flags)
};
Надеюсь мой опыт кому-нибудь поможет !
Еще раз, большое спасибо