对于不熟练的同学来说在构建Java代码查询之前一定要先将DSL查询语句,这样方便构造。
首先说一下bool查询的几种逻辑关系(子查询的组合方式):
must:必须匹配每个子查询,与Java的“与”相似
should:选择性的匹配子查询,与Java的“或”相似
must_not:必须不匹配,(不参与算分)与Java的“非”相似
filter:必须匹配,(不参与算分)用来匹配自主的过滤条件
查询的基本步骤是:
1、创建SearchRequest对象
2、准备Request.source(),也就是DSL:①QueryBuilders来构建查询条件②传入Request.source()的query()方法
3、发送请求,得到结果
4、解析结果(参考DSL查询的JSON结果,从外到内,逐层解析)
全文检索的match和multi_match查询与match_all的API基本一直。差别是查询条件,也就是query的部分。同样是利用QueryBuilders提供的方法:
QueryBuilders.matchQuery("all","如家");
QueryBuilders.multiMatchQuery("如家","name","business");
相对应的DSL语句:
GET /hotel/_search
{
"query": {
"match_all":{}
}
}
GET /hotel/_search
{
"query": {
"match": {
"all":"如家"
}
}
}
GET /hotel/_search
{
"query": {
"multi_match":{
"query": "如家",
"fields": ["brand","name"]
}
}
}
精确查询:精确查询常见的有term查询和range查询,同样利用QueryBuilders实现:
//词条查询
QueryBuilders.termQuery("city","杭州");
//范围查询
QueryBuilders.rangeQuery("price").gte(100).lte(150);
对应的DSL语句:
复合查询:(这里也就是步骤的第二步)
//创建布尔查询
BoolQueryBuilders boolQuery = QueryBuilders.boolQuery();
//添加must条件
boolQuery.must(QueryBuilders.termQuery("city","杭州"));
//添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
相对应的DSL语句:
在构建查询语句的时候只要记住QueryBuilders这一个类就OK了 。
所有搜索DSL的构建,记住一个API:SearchRequest的source()方法:
第一步:准备Request:SearchRequest request = new SearchRequest("索引库名")
第二步:准备DSL,准备BooleanQuery,构建查询语句(添加term,添加filter)
第三步:发送请求
request.source().query(boolquery);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
第四步:解析响应
【仅作记录】



