问题描述
{name: 'A',website: 'example.com',date: 1,+ other fields}
{name: 'A',date: 2,+ other fields}
{name: 'B',website: 'something.com',+ other fields}
{name: 'C',+ other fields}
我想对name
和website
进行多次查询,同时还只返回最新结果。我的查询如下:
query: {
bool: {
...optional filters...,must: {
multi_match: {
query: input,type: "most_fields",fields: ["name^3",...,"website"],},
{name: 'A',+ other fields}
现在我了解到需要使用agg
来获取top_hits
的最新结果,例如:
top_hits: {
size: 1,sort: [{ date: "desc" }],
但是,在先按website
然后按name
进行聚合的过程中,我失去了按_score
排序的顺序,这对我的查询很重要。我已经尝试过使用composite
agg,如何无法根据结果记录的分数对其进行排序。
解决方法
我正在考虑使用额外的手动创建一个字段,该字段是name
和website
的串联,然后可以将其用作单级聚合,然后使我可以按{ {1}}。例如:
_score
,
您应该能够使用脚本在术语agg中的热门歌曲agg上执行此操作。 根据{{3}}
的文档排序-应该对最匹配的匹配进行排序。默认情况下,匹配是按主要查询的得分排序的。
{
"size": 0,"query": {
"bool": {
"must": [
{"multi_match": {
"query": "A","type": "most_fields","fields": ["name^3","website"]
}}
]
}
},"aggs": {
"visitor": {
"terms": {
"script": "doc['name'].value +'-'+ doc['website'].value","size": 10
},"aggs": {
"top_visitors": {
"top_hits": {
"size": 1
}
}
}
}
}
}
您的结果将如下所示:
"visitor" : {
"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [
{
"key" : "A-example.com","doc_count" : 2,"top_visitors" : {
"hits" : {
"total" : {
"value" : 2,"relation" : "eq"
},"max_score" : 1.7260926,"hits" : [
{
"_index" : "test-52","_type" : "_doc","_id" : "vu_xUnQB5HlCKIdlWRy8","_score" : 1.7260926,"_source" : {
"name" : "A","website" : "example.com","date" : 1
}
}
]
}
}
},{
"key" : "A-something.com","_id" : "VWDxUnQBx_BqvGcp8U8j","website" : "something.com","date" : 1
}
}
]
}
}
}
]
}
在使用脚本进行性能聚合时要小心,因为它会占用大量资源并且运行速度很慢。