解决ES中同时使用must和should 只有must生效的问题
错误示例
- DSL语句版
1 | GET /hotel/_search |
- JavaAPI版
1 | BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); |
- 布尔查询中,使用should属性时,生效了,但没完全生效。
- 查到的结果集中包含了
上海希尔顿和上海皇冠假日的酒店文档,但是后面还出现了其他品牌的酒店文档 - 利用控制变量法,成功找到bug原因
- 单独使用
must查询,没有问题 - 单独使用
should查询,没有问题 - 联合使用
must和should,查询到的结果条数,与单独使用must一样。但是排序是优先展示符合should条件的文档
- 单独使用
失效原因
- should在和must同时使用的时候es内部属性
minumum_should_match默认是 0 - 单独使用should时
minumum_should_match默认是 1
解决方案
- 方案一:为
minumum_should_match手动赋值
1 | BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); |
- 方案二:将should查询对象设置到must方法中
1 | BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); |
评论

