RestHighLevelClient操作查询文档
查询操作基本步骤
//注入依赖
@Autowired
private RestHighLevelClient restHighLevelClient;
//1.创建查询索引对象
SearchRequest request = new SearchRequest("索引库名");
//2.创建构生成器对象
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders qbs);
//可以直接写成 => request.source().query(QueryBuilders qbs); //不创建对象
//3.传入生成器
request.source(sourceBuilder);
//4.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//5.解析响应数据
handleResponse(response);
批量同步
//数据库同步索引库-批量操作
@Test
void testBulkNewRequest() throws IOException {
//分页打包添加 批量导入文档
int page = 1;
int size = 100;
Page<Hotel> hotelPage = hotelService.page(new Page<>(page, size));
for (long i = 1; i <= hotelPage.getPages(); i++) {
Page<Hotel> hotelData = hotelService.page(new Page<>(i, size));
BulkRequest bulkRequest = new BulkRequest();
for (Hotel hotel : hotelData.getRecords()) {
HotelDoc hotelDoc = new HotelDoc(hotel);
String hotelString = JSONObject.toJSONString(hotelDoc);
bulkRequest.add(new IndexRequest("hotel")
.id(hotelDoc.getId().toString())
.source(hotelString, XContentType.JSON));
}
client.bulk(bulkRequest, RequestOptions.DEFAULT);
}
}
文档的增删改查操作
class HotelDocumentTest {
@Autowired
private RestHighLevelClient client;
@Autowired
private IHotelService hotelService;
/**
* 文档的增删改查操作
*
* @throws IOException io
*/
@Test
void testAddDoc() throws IOException {
//1.查询数据库hotel数据
Hotel hotel = hotelService.getById(61083);
//2.转换为HotelDoc
HotelDoc hotelDoc = new HotelDoc(hotel);
//3.转换成json
String jsonString = JSONObject.toJSONString(hotelDoc);
//4.准备request
IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
//5.这是发送的文档
request.source(jsonString, XContentType.JSON);
client.index(request, RequestOptions.DEFAULT);
}
@Test
void testGetDoc() throws IOException {
//1.准备Request
GetRequest request = new GetRequest("hotel").id("61083");
//2.发送请求
GetResponse response = client.get(request, RequestOptions.DEFAULT);
//3.解析响应
String source = response.getSourceAsString();
//json转换成对象
HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);
System.out.println(hotelDoc);
}
@Test
void testDeleteDoc() throws IOException {
DeleteRequest request = new DeleteRequest("hotel", "s1bhYYsBHGmKNOlBr0L6");
client.delete(request, RequestOptions.DEFAULT);
}
@Test
void testUpdateDoc() throws IOException {
UpdateRequest request = new UpdateRequest("hotel", "61083");
request.doc(
"price", "999"
);
client.update(request, RequestOptions.DEFAULT);
}
完全匹配查询
@Test
void testMatchAll() throws IOException {
SearchRequest request = new SearchRequest("hotel");
//查询所有数据
/*
GET /_search
{
"query": {
"match_all": {}
}
}
*/
request.source().query(QueryBuilders.matchAllQuery());
//查询单字段
/*
GET /index_name/_search
{
"query": {
"match": {
"name": "如家"
}
}
}
*/
request.source().query(QueryBuilders.matchQuery("name", "如家"));
//查询多个字段
/*
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "如家",
"fields": ["name","brand"]
}
}
}
*/
request.source().query(QueryBuilders.multiMatchQuery("如家", "name", "brand"));
//发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//解析响应
handleResponse(response);
}
精确查询
@Test
void testExactQuery() throws IOException {
SearchRequest request = new SearchRequest("hotel");
//查询所有数据 准备DSL
//精确查询
/*
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "北京"
}
}
}
}
*/
request.source().query(QueryBuilders.termQuery("city", "北京"));
//发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//解析响应
handleResponse(response);
}
布尔查询
@Test
void testBooleanQueries() throws IOException {
SearchRequest request = new SearchRequest("hotel");
//查询所有数据
//布尔查询
/*
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "如家",
"fields": [
"name"
]
}
}
],
"must_not": [
{
"range": {
"price": {
"gte": 0,
"lte": 400
}
}
}
],
"filter": [
{
"geo_distance": {
"distance": "10km",
"location": "39.909187,116.397455"
}
}
]
}
}
}
*/
request.source().query(QueryBuilders.boolQuery()
.must(QueryBuilders.multiMatchQuery("如家", "name"))
.mustNot(QueryBuilders.rangeQuery("price").gte(0).lte(400))
.filter(QueryBuilders.geoDistanceQuery("location").distance("10km").point(39.909187, 116.397455)));
//发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//解析响应
handleResponse(response);
}
分页排序
@Test
void testPage() throws IOException {
SearchRequest request = new SearchRequest("hotel");
//查询所有数据 准备DSL
//分页 排序
/*
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 5,
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
*/
request.source()
.query(QueryBuilders.matchAllQuery())
.from(1)
.size(10)
.sort("price", SortOrder.DESC);
//发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//解析响应
handleResponse(response);
}
关键字高亮处理
@Test
void testHighlight() throws IOException {
SearchRequest request = new SearchRequest("hotel");
//查询所有数据 准备DSL
//高亮
/*
#如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {
"fields": {
"name": {
"require_field_match": "false"
}
}
}
}
#// 查询条件,高亮一定要使用全文检索查询
GET /hotel/_search
{
"query": {
"match": {
"brand": "如家"
}
},
"highlight": {
"fields": {
"brand": {
"pre_tags": "<em>",
"post_tags": "</em>"
}
}
}
}
*/
request.source()
.query(QueryBuilders.matchQuery("brand", "如家"))
.highlighter(new HighlightBuilder()
.field("brand")
.preTags("<em>")
.postTags("</em>"));
//发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//解析响应
handleResponseTag(response);
}
响应数据统一处理
/**
* 处理响应数据方法
*
* @param response 响应数据
*/
private void handleResponse(SearchResponse response) {
long value = response.getHits().getTotalHits().value;
System.out.println("总共" + value + "条记录");
for (SearchHit hit : response.getHits().getHits()) {
String source = hit.getSourceAsString();
//字符串反序列化成对象
HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);
System.out.println(hotelDoc);
}
}
/**
* 处理高亮显示数据响应
*
* @param response 响应数据
*/
private void handleResponseTag(SearchResponse response) {
// 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("brand");
if (highlightField != null) {
// 获取高亮值
String brand = highlightField.getFragments()[0].string();
// 覆盖非高亮结果
hotelDoc.setBrand(brand);
}
}
System.out.println(hotelDoc);
}
}
}