我有一个保存在ElasticSearch中的Book模型,它有两个属性minimumAge和maximumAge,这两个属性决定了推荐的图书年龄
我有几个搜索booking的用例。第一个用例是按minimumAge搜索书籍。所以假设用户搜索minimumAge 5,我必须得到所有要求minimumAge为5的书籍或那些没有minimumAge的书籍。
我使用了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是有效的图书结果
因此,我陷入了什么是紧凑查询来解决这个特定的情况。我的第一个想法过程类似于第一个查询,但四个should子句和匹配任何1。任何指针都将受到欢迎
2条答案
按热度按时间x0fgdtte1#
您必须在
should
子句中写入每个案例以满足所有场景。下面的弹性查询将涵盖您的所有要求-whlutmcx2#
你可以使用下面的ElasticSearch查询,它将为您的要求工作。我希望你将能够在Java中创建查询。