elasticsearch,Spring Boot,elasticsearch" /> elasticsearch,Spring Boot,elasticsearch" />

Spring boot Elasticsearch集成高级和低级API

Spring boot Elasticsearch集成高级和低级API,spring-boot,elasticsearch,Spring Boot,elasticsearch,我构建了Elasticsearch查询(DSL),如下所示。我想从Java应用程序中集成它。当我阅读高级和低级REST选项时,由Elastic提供。是否可以使用高级API构建复杂的查询?或者我将使用低级API并通过程序构建DSL GET myindex/_search { "query": { "bool": { "must": [ { "nested": { "path": "blo

我构建了Elasticsearch查询(DSL),如下所示。我想从Java应用程序中集成它。当我阅读高级和低级REST选项时,由Elastic提供。是否可以使用高级API构建复杂的查询?或者我将使用低级API并通过程序构建DSL

GET myindex/_search
{
    "query": {
        "bool": {
        "must": [
          {
            "nested": {
              "path": "blog_types",
              "query": {
                "match": {
                  "blog_types.blog_type": 45649
                }
              }
            }
          },
          {
            "nested": {
              "path": "blog_types",
              "query": {
                "match": {
                  "blog_types.blog_type": 45647
                }
              }
            }
          }
        ],
        "filter" : {
            "geo_bounding_box" : {
                "request_location.location" : {
                    "top_left" : {
                        "lat" : 50.925996,
                        "lon" : 4.584309
                    },
                    "bottom_right" : {
                        "lat" : 50.845996,
                        "lon" : 4.494309
                    }
                }
            }
        }
        }
    }
}
好的,下面是:

QueryBuilder blogType1 = QueryBuilders.nestedQuery("blog_types", 
    QueryBuilders.matchQuery("blog_types.blog_type", 45649), ScoreMode.Avg);

QueryBuilder blogType2 = QueryBuilders.nestedQuery("blog_types", 
    QueryBuilders.matchQuery("blog_types.blog_type", 45647), ScoreMode.Avg); 

QueryBuilder geo = QueryBuilders.geoBoundingBoxQueryBuilder("request_location.location")
    .setCorners(50.925996, 4.584309, 50.845996, 4.494309);

QueryBuilder mainQuery = QueryBuilders.boolQuery()
    .filter(blogType1)
    .filter(blogType2)
    .filter(geo);
如果需要或需要条件,可以使用
should

QueryBuilder blogType1 = QueryBuilders.nestedQuery("blog_types", 
    QueryBuilders.matchQuery("blog_types.blog_type", 45649), ScoreMode.Avg);

QueryBuilder blogType2 = QueryBuilders.nestedQuery("blog_types", 
    QueryBuilders.matchQuery("blog_types.blog_type", 45647), ScoreMode.Avg); 

QueryBuilder geo = QueryBuilders.geoBoundingBoxQueryBuilder("request_location.location")
    .setCorners(50.925996, 4.584309, 50.845996, 4.494309);

QueryBuilder mainQuery = QueryBuilders.boolQuery()
    .should(blogType1)
    .should(blogType2)
    .filter(geo)
    .minimumShouldMatch(1);
对于未来用户: 假设我们要使用ES客户端复制此查询:

  {
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "match": {
                  "table_name": {
                    "query": "google",
                    "operator": "and"
                  }
                }
              },
              {
                "match": {
                  "table_name": {
                    "query": "yahoo",
                    "operator": "and"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "match": {
                  "vendor_type": {
                    "query": "9",
                    "operator": "and"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
使用此代码可获得以下信息:

    //Sub Query of MustBool
    BoolQueryBuilder mustNotBoolQueryBuilder = QueryBuilders.boolQuery();
    mustNotBoolQueryBuilder.mustNot(QueryBuilders.matchQuery("vendor_type",  String.valueOf(DBVendor.Collibra.getValue())).operator(Operator.AND));

    //Sub Query of MustBool
    BoolQueryBuilder shouldBoolQueryBuilder = QueryBuilders.boolQuery();
    assetNames.forEach(assetName -> {
        shouldBoolQueryBuilder.should(QueryBuilders.matchQuery("table_name",assetName).operator(Operator.AND));
    });

    //Root Bool
    BoolQueryBuilder mustBoolQueryBuilder = QueryBuilders.boolQuery();
    mustBoolQueryBuilder.must(shouldBoolQueryBuilder);
    mustBoolQueryBuilder.must(mustNotBoolQueryBuilder);

高级REST客户机允许您构建像上面这样的复杂查询,请看这里:有参考的示例代码吗?我所能做的只是简单的查询,当涉及到多个条件时,我有点卡住了。如何提及“blogType1”和“blogType2”之间的条件?如果我想提出它或条件,如何提及条件?谢谢!!但我想要的是这样。。。(“blogType1”或“blogType1”)和(“geo”)啊,好的。如果我有另一个条件,比如(((“blogType1”或“blogType1”)和(“geo”)或(“newCondition1”或“newCondition2”),这会发生什么变化?你需要使用
should
(或)+
filter/must
(和)来处理布尔查询,并根据你的喜好将它们组合起来。这方面运气好吗?