目前,我们正在通过弹性搜索多个请求。
我想要的是,例如,如果你有一个水果索引,数据“卡路里”,“名字”和“家庭”,我想要前三个(基于卡路里的)水果与家庭“a”,前3名“b”,前3名“c”。
目前我会搜索3次,查询如下:
{
"sort": [ {"calories": "desc"} ],
"query": {
"bool" : {
"must": [
{"term": { "family": "a" }} // second time "b", third time "c"...
]
}
},
"from": 0,
"size": 3
}
使用QueryBuilders.boolQuery().must(QueryBuilders.termQuery("family", "a"));
(因为上面的查询将处于循环中,所以第二次是“b”,第三次是“c”)
我的问题是,我是否能以某种方式从SQL中执行类似于UNION的功能?加入3个结果与家庭“a”,3个与家庭“b”和3个与家庭“c”。如何在Java(Spring Boot)中完成这将是非常有帮助的!
谢谢!如果说明/说明不好,请告诉我,我会详细说明。
答案 0 :(得分:1)
您可以执行多搜索并在Java中执行UNION(这是更好的方式,因此您可以轻松地对结果进行排名)。
或者,使用bool
should
查询来执行OR
条款。
"bool" : {
"should": [
{"term": { "family": "a" }},
{"term": { "family": "b" }},
{"term": { "family": "c" }}
]
}
但很难控制家人有多少结果。
另一个解决方案是使用术语聚合+ top_hits:
{
"query": {
"match_all": {}
},
"aggs": {
"family": {
"terms": {
"field": "family"
},
"aggs": {
"top_sales_hits": {
"top_hits": {
"sort": [
{
"date": {
"order": "desc"
}
}
],
"_source": {
"includes": [
"date",
"price"
]
},
"size": 10
}
}
}
}
}
}
注意:这只是一个例子,而不是一个有效的解决方案。