目前我们正在通过多个请求搜索弹性。
我想要的是,例如,如果您有一个水果索引,其中包含数据“卡路里”、“名称”和“家庭”,我想要前 3 个(基于卡路里的)家庭为“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)中完成此操作将非常有帮助!
谢谢!如果描述/解释不好,请告诉我,我会尽力详细说明。
最佳答案
您可以执行多重搜索并在 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
}
}
}
}
}
}
注意:这只是一个示例,不是一个可行的解决方案。
关于java - 通过elasticsearch和spring进行联合搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44842246/