java - 通过elasticsearch和spring进行联合搜索

标签 java spring performance elasticsearch spring-boot

目前我们正在通过多个请求搜索弹性。

我想要的是,例如,如果您有一个水果索引,其中包含数据“卡路里”、“名称”和“家庭”,我想要前 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:

( https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html )

{
  "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/

相关文章:

java - 我们可以使用Java中的 "new"关键字创建一个HttpResponse对象吗?

java - 在SWT环境中如何知道一个线程是否完成了它的任务?

c++ - 在什么情况下给出一个纯虚函数的实现是有利的?

MySQL 唯一键而不是 PK

mysql - 对大量数据进行分页

java - arraylist 的副本不断被修改为原始值

java - 如何从像素绘制 3D 对象?

spring boot和批处理抛出无效的对象名称 'BATCH_JOB_INSTANCE'

java - 在不同的事务问题中保持相同的依赖关系

java - IntelliJ Tomcat 延迟 war 部署