13-RestClient查询文档-match、term、range、bool查询
1.全文检索查询
全文检索的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"]
}
}
}
// match、multiMatch
@Test
public void testMatch() throws IOException {
// 1.准备Request
SearchRequest request = new SearchRequest("hotel");
// 2.准备参数
request.source().query(QueryBuilders.matchQuery("all", "如家"));
// request.source().query(QueryBuilders.multiMatchQuery("如家", "name", "brand", "business"));
// 3. 发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handleResponse(response);
}
// 响应结果解析
private void handleResponse(SearchResponse response) {
// 4.解析响应
SearchHits searchHits = response.getHits();
// 4.1.得到total总条数
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到" + total + "条数据");
// 4.2.文档数组
SearchHit[] hits = searchHits.getHits();
// 4.3 遍历
for (SearchHit hit : hits) {
// 获取文档source
String json = hit.getSourceAsString();
// 反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println("hotelDoc = " + hotelDoc);
}
}
2.精确查询
精确查询常见的有term查询和range查询,同样利用QueryBuilders实现:
// 词条查询
QueryBuilders.termQuery("city", "杭州");
// 范围查询
QueryBuilders.rangeQuery("price").gte(100).lte(150);
DSL语句:
GET /hotel/_search
{
"query": {
"term": {
"city": "杭州"
}
}
}
GET /hotel/_search
{
"query": {
"range": {
"price": { "gte": 100, "lte": 150 }
}
}
}
3.复合查询-boolean query(可以链式编程)
精确查询常见的有term查询和range查询,同样利用QueryBuilders实现:
// 创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加must条件
boolQuery.must(QueryBuilders.termQuery("city", "杭州"));
// 添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
DSL语句:
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"term": { "city": "杭州" }
}
],
"filter": [
{
"range": {
"price": { "lte": 250 }
}
}
]
}
}
}
Java代码:
// term,range,bool
@Test
public void testBool() throws IOException {
// 1.准备Request
SearchRequest request = new SearchRequest("hotel");
// 2.准备参数
// 2.1词条查询
// request.source().query(QueryBuilders.termQuery("business", "宝安商业区"));
// 2.2范围查询
// request.source().query(QueryBuilders.rangeQuery("price").gt(100).lt(200));
// 2.3bool查询
request.source().query(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("city", "上海"))
.filter(QueryBuilders.rangeQuery("price").lt(300))
);
// // 2.准备DSL
// // 2.1 准备BooleanQuery
// BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// // 2.2 添加term
// boolQuery.must(QueryBuilders.termQuery("city", "上海"));
// // 2.3 添加range
// boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
// request.source().query(boolQuery);
// 3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handleResponse(response);
}
4.总结:
要构建查询条件,只要记住一个类:QueryBuilders