目录
RestAPI中其中构建查询条件的核心部分是由一-个名为QueryBuilders的工具类提供的,其中包含了各种查询方法:

可以看到方法非常得多,挑一些常用的举例说明。
1.MATCH_ALL
API使用和结果展示:

可以看到获取到的内容与我们在浏览器的dev-tool里使用match_all方法是一样的
这个hits里面保存的就是我们要获取的主要内容,封装好的响应类里面提供了getHits方法帮助我们获取数据

查看结果:

2.全文检索查询
2.1match查询
全文检索的match和multi_ match查询与match_ all的API基本一 致。 差别是查询条件,也就是query的部分。
同样是使用QueryBuilders提供的方法:
matchQuery,单字段查询
举例:request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));
结果:
效果同:
GET /hotel/_search
{
"query": {
"match": {
"all": "皇冠假日"
}
}
}
完整代码如下:
@Test
public void matchSomething () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
// 2.1 单字段查询 matchQuery(字段,搜索内容)
request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));
// 3.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
hits.forEach( v -> {
String sourceAsString = v.getSourceAsString();
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
System.out.println(hotel);
});
}
multiMatchQuery,多字段查询
举例:
request.source().query(QueryBuilders.multiMatchQuery("万豪","brand","business"));
结果:

效果同:
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "万豪",
"fields": ["name","business"]
}
}
}
完整代码如下:
@Test
public void matchSomething () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
// 2.2 多字段查询 multiMatchQuery(搜索内容,字段1,[字段2,字段3,......])
request.source().query(QueryBuilders.multiMatchQuery("万豪","brand","business"));
// 3.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
hits.forEach( v -> {
String sourceAsString = v.getSourceAsString();
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
System.out.println(hotel);
});
}
3.精确查询
3.1term查询
举例:QueryBuilders.termQuery("city","北京");
结果:

效果同:
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "北京"
}
}
}
}
完整代码如下:
@Test
public void matchTerm () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.termQuery("city","北京"));
// 3.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
hits.forEach( v -> {
String sourceAsString = v.getSourceAsString();
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
System.out.println(hotel);
});
}
3.2range查询
举例:QueryBuilders.rangeQuery("price").gte(100).lte(600);
结果:

效果同:
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 700,
"lte": 1000
}
}
}
}
完整代码如下:
@Test
public void matchRange () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(600));
// 3.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
hits.forEach( v -> {
String sourceAsString = v.getSourceAsString();
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
System.out.println(hotel);
});
}
4.排序和分页
4.1排序
举例:requset.source.sort("price",SortOrder.ASC);
完整代码:
@Test
public void matchSort () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().sort("price", SortOrder.ASC);
// 3.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
hits.forEach( v -> {
String sourceAsString = v.getSourceAsString();
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
System.out.println(hotel);
});
}
结果:

效果同:
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "asc"
}
}
]
}
4.2 分页
举例:request.source().from(0).size(5);
完整代码:
@Test
public void matchPage () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().from(0).size(5);
// 3.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
hits.forEach( v -> {
String sourceAsString = v.getSourceAsString();
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
System.out.println(hotel);
});
}
结果:

效果同:
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 5
}
5.高亮
高亮API包括请求DSL构建和结果解析两部分。我们先看请求的DSL:
request.source().
highlighter(new HighlightBuilder()
.field("name")
// 是否需要与查询字段匹配
.requireFieldMatch(false)
);
测试代码:
@Test
public void matchHighLight () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));
// 3. 高亮
request.source().highlighter(new HighlightBuilder()
.field("name")
.requireFieldMatch(false)
);
// 4.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
hits.forEach( v -> {
String sourceAsString = v.getSourceAsString();
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
System.out.println(hotel);
});
}
效果:

可以看到我们匹配的字符串都被打上了<em></em>默认高亮标签
但是呢,其实高亮内容的处理比较复杂,看看这里是如何获取的,代码如下:
@Test
public void matchHighLight () throws IOException {
// 1.准备request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.matchQuery("all","皇冠假日"));
// 3. 高亮
request.source().highlighter(new HighlightBuilder()
.field("name")
.requireFieldMatch(false)
);
// 4.发送请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
// 获取主要内容 文档存放对象
SearchHits hits = search.getHits();
// 获取文档数组
SearchHit[] hits1 = hits.getHits();
// 遍历
for(SearchHit s : hits1) {
// 获取文档source
String sourceAsString = s.getSourceAsString();
// 反序列化
Hotel hotel = JSON.parseObject(sourceAsString, Hotel.class);
// 获取高亮结果
Map<String, HighlightField> highlightFields = s.getHighlightFields();
// 根据字段名获取高亮结果
HighlightField name = highlightFields.get("name");
// 获取高亮值
String string = name.getFragments()[0].string();
// 覆盖非高亮结果
hotel.setName(string);
System.out.println("最终结果:" + string);
}
}
输出:

ElasticsearchRESTAPI中的查询构造与实例
本文详细介绍了ElasticsearchRestAPI中如何构建查询条件,包括MATCH_ALL、全文检索查询(match和multi_match)、精确查询(term和range),以及排序、分页和高亮功能的使用示例。
1179

被折叠的 条评论
为什么被折叠?



