elasticsearch,spring-boot,Java,Spring,Performance,elasticsearch,Spring Boot" /> elasticsearch,spring-boot,Java,Spring,Performance,elasticsearch,Spring Boot" />

Java 通过elasticsearch和spring进行联合搜索

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

目前,我们正在搜索多个请求的elastic

我想要的是,例如,如果你有一个水果指数,数据是“卡路里”,“名字”和“家庭”,我想要前三名(基于calory的)水果,家庭是“a”,前三名是“b”,前三名是“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(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
               }
            }
         }
      }
   }
}