布尔查询
boolQuery:对多个查询条件进行连接。连接方式有:
- must(and):条件必须成立
- must_not(not):条件必须不成立
- should(or):条件可以成立
- filter:条件必须成立。性能比must高,因为不会计算得分
查询的脚本格式:
GET 索引名称/_search
{
"query": {
"bool": {
"must": [
{}, {}, {}
],
"filter": [
{}, {}, {}
],
"must_not": [
{}, {}, {}
],
"should": [
{}, {}, {}
]
}
}
}
比如must条件里是term:
GET goods/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"brandName": {
"value": "brandName1"
}
}
}
]
}
}
}
GET goods/_search
GET goods/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"brandName": {
"value": "brandName1"
}
}
}
],
"filter": [
{
"term": {
"title": "title1"
}
},
{
"range": {
"price": {
"gte": 100,
"lte": 500
}
}
}
],
"should": [
{
"term": {
"categoryName": "categoryName1"
}
}
]
}
}
}
/**
* 布尔查询:boolQuery
* 1、查询品牌名称
* 2、查询标题
* 3、查询价格范围
*/
@Test
public void testBoolQuery() throws IOException {
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 1、构建boolQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 2、构建各个查询条件
// 2.1 查询品牌名称
QueryBuilder termQuery = QueryBuilders.termQuery("brandName", "brandName1");
boolQuery.must(termQuery);
// 2.2 查询标题
QueryBuilder matchQuery = QueryBuilders.matchQuery("categoryName", "categoryName1");
boolQuery.filter(matchQuery);
// 2.3 查询价格范围
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("price");
rangeQuery.gte(100);
rangeQuery.lte(500);
boolQuery.filter(rangeQuery);
// 3、使用boolQuery连接
sourceBuilder.query(boolQuery);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
long value = searchHits.getTotalHits().value;
System.out.println("总记录数:" + value);
SearchHit[] hits = searchHits.getHits();
List<Goods> goodsList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Goods goods = JSON.parseObject(sourceAsString, Goods.class);
goodsList.add(goods);
}
goodsList.forEach(c -> System.out.println(JSON.toJSONString(c)));
}