Spring boot Elasticsearch集成高级和低级API
我构建了Elasticsearch查询(DSL),如下所示。我想从Java应用程序中集成它。当我阅读高级和低级REST选项时,由Elastic提供。是否可以使用高级API构建复杂的查询?或者我将使用低级API并通过程序构建DSLSpring 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
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
(和)来处理布尔查询,并根据你的喜好将它们组合起来。这方面运气好吗?