联盟搜索弹性搜索和弹簧

时间:2017-06-30 08:42:34

标签: java spring performance elasticsearch spring-boot

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

我想要的是,例如,如果你有一个水果索引,数据“卡路里”,“名字”和“家庭”,我想要前三个(基于卡路里的)水果与家庭“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)中完成这将是非常有帮助的!

谢谢!如果说明/说明不好,请告诉我,我会详细说明。

1 个答案:

答案 0 :(得分:1)

您可以执行多搜索并在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
               }
            }
         }
      }
   }
}

注意:这只是一个例子,而不是一个有效的解决方案。