java 操作DSL语句代码
查询所有
public void handleResponse(SearchResponse search){
SearchHits searchHits = search.getHits();
// 查询的总条数
long total = searchHits.getTotalHits().value;
// 查询的结果数组
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
// 得到json数据
String source = hit.getSourceAsString();
System.out.println(source);
}
}
/**
* 查询所有数据
* @throws IOException
*/
@Test
void testMatchAll() throws IOException {
// 准备Request对象
SearchRequest hotel = new SearchRequest("hotel");
// 组织DSL参数
hotel.source()
.query(QueryBuilders.matchAllQuery());
// 发送请求,得到响应结果
SearchResponse search = client.search(hotel, RequestOptions.DEFAULT);
// 解析数据
handleResponse(search);
}
match查询
@Test
void testMatch() throws IOException {
// 准备request
SearchRequest hotel = new SearchRequest("hotel");
// 准备DSL语句
// 单字段
hotel.source().query(QueryBuilders.matchQuery("all","如家"));
// 多字段
hotel.source().query(QueryBuilders.multiMatchQuery("如家","name","business"));
// 发送请求
SearchResponse search = client.search(hotel, RequestOptions.DEFAULT);
// 解析响应
handleResponse(search);
}
精确查询
term精确
@Test
void testTerm() throws IOException {
// 准备request
SearchRequest hotel = new SearchRequest("hotel");
// 准备DSL语句 词条精确匹配
hotel.source().query(QueryBuilders.termQuery("city","上海"));
// 发送请求
SearchResponse search = client.search(hotel, RequestOptions.DEFAULT);
// 解析响应
handleResponse(search);
}
range 范围
@Test
void testRange() throws IOException {
// 准备request
SearchRequest hotel = new SearchRequest("hotel");
// 准备DSL语句 词条精确匹配
hotel.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(500));
// 发送请求
SearchResponse search = client.search(hotel, RequestOptions.DEFAULT);
// 解析响应
handleResponse(search);
}
布尔查询
布尔查询是用must、must_not、filter等方式组合其它查询
@Test
void testBool() throws IOException {
// 准备request
SearchRequest hotel = new SearchRequest("hotel");
// 准备DSL语句
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加term
boolQuery.must(QueryBuilders.termQuery("city","上海"))
.filter(QueryBuilders.rangeQuery("price").lte(500));
hotel.source().query(boolQuery);
// 发送请求
SearchResponse search = client.search(hotel, RequestOptions.DEFAULT);
// 解析响应
handleResponse(search);
}
排序分页
搜索结果的排序和分页是与query同级的参数,因此同样是使用request.source()来设置。
@Test
void testPageAndSort() throws IOException {
// 页码 每一页条数
int page = 1,pageSize = 5;
// 准备request
SearchRequest hotel = new SearchRequest("hotel");
// 准备DSL语句 词条精确匹配
hotel.source().query(QueryBuilders.matchAllQuery());
// 排序
hotel.source().sort("price", SortOrder.ASC);
// 分页 from size
hotel.source().from((page-1)*pageSize).size(5);
// 发送请求
SearchResponse search = client.search(hotel, RequestOptions.DEFAULT);
// 解析响应
handleResponse(search);
}
高亮显示
高亮的代码与之前代码差异较大,有两点:
- 查询的DSL:其中除了查询条件,还需要添加高亮条件,同样是与query同级。
- 结果解析:结果除了要解析_source文档数据,还要解析高亮结果
@Test
void testHighlight() throws IOException {
// 准备request
SearchRequest hotel = new SearchRequest("hotel");
// 准备DSL语句 词条精确匹配
hotel.source().query(QueryBuilders.matchQuery("all","如家"));
hotel.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
// 发送请求
SearchResponse response = client.search(hotel, RequestOptions.DEFAULT);
// 解析响应
// 4.解析响应
SearchHits searchHits = response.getHits();
// 4.1.获取总条数
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);
// 获取高亮结果
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);
}
}
System.out.println("hotelDoc = " + hotelDoc);
}
}