查询的基本步骤是: 创建SearchRequest对象 准备Request.source(),也就是DSL。 QueryBuilders来构建查询条件 传入Request.source() 的 query() 方法 发送请求,得到结果 解析结果(参考JSON结果,从外到内,逐层解析)
全文检索
全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。 同样是利用QueryBuilders提供的方法:
// 单字段查询
QueryBuilders.matchQuery("all", "如家");
// 多字段查询
QueryBuilders.multiMatchQuery("如家", "name", "business");
精确查询常见的有term查询和range查询,同样利用QueryBuilders实现
// 词条查询
QueryBuilders.termQuery("city", "杭州");
// 范围查询
QueryBuilders.rangeQuery("price").gte(100).lte(150);
精确查询常见的有term查询和range查询,同样利用QueryBuilders实现:
// 创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加must条件
boolQuery.must(QueryBuilders.termQuery("city", "杭州"));
// 添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
要构建查询条件,只要记住一个类:QueryBuilders
排序和分页
搜索结果的排序和分页是与query同级的参数,对应的API如下
// 查询
request.source().query(QueryBuilders.matchAllQuery())
高亮
高亮API包括请求DSL构建和结果解析两部分。我们先看请求的DSL构建:
request.source().highlighter(new HighlightBuilder().field("name")
// 是否需要与查询字段匹配
.requireFieldMatch(false) );
高亮结果解析
高亮的结果处理相对比较麻烦:
// 获取source HotelDoc hotelDoc = JSON.parseObject(hit.getSourceAsString(), HotelDoc.class); // 处理高亮 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); if (!CollectionUtils.isEmpty(highlightFields)) { // 获取高亮字段结果 HighlightField highlightField = highlightFields.get("name"); if (highlightField != null) { // 取出高亮结果数组中的第一个,就是酒店名称 String name = highlightField.getFragments()[0].string(); hotelDoc.setName(name); } }
所有搜索DSL的构建,记住一个API:SearchRequest的source()方法。 高亮结果解析是参考JSON结果,逐层解析