代码之家  ›  专栏  ›  技术社区  ›  Toza

通过elasticsearch和spring进行联合搜索

  •  0
  • Toza  · 技术社区  · 8 年前

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

    目前,我会搜索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 回复  |  直到 8 年前
        1
  •  1
  •   Thomas Decaux    8 年前

    您可以执行多搜索并用Java进行联合(这是更好的方法,因此您可以轻松地对结果进行排序)。

    或者,使用 bool should 查询待办事项 OR

    "bool" : {
          "should": [
            {"term": { "family": "a" }},
            {"term": { "family": "b" }},
            {"term": { "family": "c" }}
          ]
        }
    

    但很难控制有多少结果是由家庭决定的。

    因此,另一种解决方案是使用术语聚合+top_点击:

    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
                   }
                }
             }
          }
       }
    }
    

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