Java 通过elasticsearch和spring进行联合搜索
目前,我们正在搜索多个请求的elastic 我想要的是,例如,如果你有一个水果指数,数据是“卡路里”,“名字”和“家庭”,我想要前三名(基于calory的)水果,家庭是“a”,前三名是“b”,前三名是“c” 目前我会搜索3次,使查询看起来像:Java 通过elasticsearch和spring进行联合搜索,java,spring,performance,
elasticsearch,spring-boot,Java,Spring,Performance,
elasticsearch,Spring Boot,目前,我们正在搜索多个请求的elastic 我想要的是,例如,如果你有一个水果指数,数据是“卡路里”,“名字”和“家庭”,我想要前三名(基于calory的)水果,家庭是“a”,前三名是“b”,前三名是“c” 目前我会搜索3次,使查询看起来像: { "sort": [ {"calories": "desc"} ], "query": { "bool" : { "must": [ {"term": { "family": "a" }} // second
{
"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(SpringBoot)中实现这一点将非常有帮助
谢谢!如果描述/解释不好,请告诉我,我将尝试详细说明。您可以执行多重搜索并使用Java进行联合(这是更好的方法,这样您可以轻松地对结果进行排序)
或者,使用bool
should
查询do或子句
"bool" : {
"should": [
{"term": { "family": "a" }},
{"term": { "family": "b" }},
{"term": { "family": "c" }}
]
}
但很难控制家庭有多少结果
因此,另一种解决方案是使用术语聚合+热门点击:
()
注意:这只是一个示例,不是有效的解决方案
{
"query": {
"match_all": {}
},
"aggs": {
"family": {
"terms": {
"field": "family"
},
"aggs": {
"top_sales_hits": {
"top_hits": {
"sort": [
{
"date": {
"order": "desc"
}
}
],
"_source": {
"includes": [
"date",
"price"
]
},
"size": 10
}
}
}
}
}
}