Elasticsearch Java-使用should子句进行搜索



我有一个保存在弹性搜索中的Book模型。它有两个属性minimumAge和maximumAge,这决定了推荐书的年龄

我有几个搜索预订的用例。第一种情况是按最小年龄搜索书籍。所以假设用户搜索minimumAge 5,我必须得到所有要求minimumAage为5的书,或者那些没有minimumAger的书。

我使用了should子句并设置了一个最小should子句来满足查询,如下所示

private void addSearchByMinimumAge(ProductsFilter filter, BoolQueryBuilder rootQuery) {
BoolQueryBuilder minAgeQuery = boolQuery();
minAgeQuery.minimumShouldMatch(1);
minAgeQuery.should(rangeQuery("minAge").lte(filter.getMinAge()));
BoolQueryBuilder minAgeNotExistsQuery = boolQuery();
minAgeNotExistsQuery.mustNot(existsQuery("minimumAge"));
minAgeQuery.should(minAgeNotExistsQuery);
rootQuery.must(minAgeQuery);
}

如上所述,用例运行良好。

我试图实现的第二个用例是按年龄获取书籍。例如,如果一个人搜索年龄为5岁,我需要所在的所有书籍

  • 年龄5介于或等于minAge和maxAge
  • 如果一本书不能同时使用minAge和maxAge,我仍然应该归还这本书
  • 如果某本书的minAge为空,但maxAge小于或等于5,则应返回该本书
  • 最后,如果maxAge为空,那么minAge大于或等于5的所有书籍也应该返回
{ "name" : "Book1" , "minAge": 3 , "maxAge": 8 }
{ "name" : "Book2" , "minAge": 6 , "maxAge": 8 }
{ "name" : "Book3" , "minAge": 3 , "maxAge": 5 }
{ "name" : "Book4" , "minAge": 5 , "maxAge": 8 }
{ "name" : "Book5" }
{ "name" : "Book6" , "minAge": 3 }
{ "name" : "Book7" , "minAge": 6 }
{ "name" : "Book8" , "maxAge": 6 }
{ "name" : "Book9" , "maxAge": 4 }

在上面的数据集中,如果我通过了书籍1、3、4、5、6、8,则书籍结果有效

因此,我一直在思考什么是一个紧凑的查询来解决这个特定的场景。我的第一个思考过程类似于第一个查询,但四个应该子句并匹配任意一个1。任何指针都将受到赞赏

您必须在should子句中编写每个案例才能满足所有场景。以下弹性查询将涵盖您的所有要求-

{
"query": {
"bool": {
"should": [
{
"bool" : {
"must" : [
{
"range": {
"minAge": {
"lte": 5
}
}
},
{
"range": {
"maxAge": {
"gte": 5
}
}
}
] 
} 
},
{
"bool": {
"must_not": [
{
"exists": {
"field": "minAge"
}
},
{
"exists": {
"field": "maxAge"
}
}
]
}
}, 
{
"bool" : {
"must" : [
{
"range": {
"minAge": {
"lte": 5
}
}
},
{
"bool" : {
"must_not" : {
"exists" : {
"field" : "maxAge" 
} 
} 
} 
} 
] 
} 
}, 
{
"bool" : {
"must" : [
{
"range": {
"maxAge": {
"gte": 5
}
}
},
{
"bool" : {
"must_not" : {
"exists" : {
"field" : "minAge" 
} 
} 
} 
} 
] 
} 
} 
]
}
}
}

您可以使用下面的弹性搜索查询,它将满足您的需求。我希望您能够用Java创建查询。

{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"range": {
"minAge": {
"lte": 5
}
}
},
{
"range": {
"maxAge": {
"gte": 5
}
}
}
]
}
},
{
"bool": {
"must_not": [
{
"exists": {
"field": "minAge"
}
},
{
"exists": {
"field": "maxAge"
}
}
]
}
},
{
"bool": {
"must": [
{
"range": {
"maxAge": {
"gte": 5
}
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "minAge"
}
}
}
}
]
}
},
{
"bool": {
"must": [
{
"range": {
"minAge": {
"lte": 5
}
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "maxAge"
}
}
}
}
]
}
}
]
}
}
}

最新更新