@Autowired
private RestHighLevelClient restHighLevelClient;
public void findById(String id) throws IOException {
GetRequest request = new GetRequest("indexName", id);
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
String source = response.getSourceAsString();
}
public void update(String id) throws IOException {
GetRequest request = new GetRequest("indexName", id);
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
String data = "{'username','张三','job':'键盘侠'}";
if(exists){
// 更新
UpdateRequest updateRequest = new UpdateRequest("indexName", id);
updateRequest.doc(data, XContentType.JSON);
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
}else {
// 添加
IndexRequest addRequest = new IndexRequest("indexName");
addRequest.id(id);
addRequest.source(data, XContentType.JSON);
restHighLevelClient.index(addRequest,RequestOptions.DEFAULT);
}
}
public boolean deleteById(String id) throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("indexName", id);
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
return true;
}
public List<Object> searchByKeywords(String keywords) throws IOException {
SearchRequest searchRequest = new SearchRequest("indexName");
// 用于构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "username", "job");
searchSourceBuilder.query(multiMatchQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] searchHits = searchResponse.getHits().getHits();
List<Object> result = new ArrayList<>();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSourceAsString();
Object object = JSONObject.parseObject(source, Object.class);
result.add(object);
}
return result;
}
public Map<String, Object> searchByPage(String keywords, Integer pageNum, Integer pageSize) throws IOException {
SearchRequest searchRequest = new SearchRequest("indexName");
// 用于构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "username", "job");
searchSourceBuilder.query(multiMatchQueryBuilder);
// 分页
searchSourceBuilder.size(pageSize);
searchSourceBuilder.from((pageNum - 1) * pageSize);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] searchHits = searchResponse.getHits().getHits();
List<Object> list = new ArrayList<>();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSourceAsString();
Object object = JSONObject.parseObject(source, Object.class);
list.add(object);
}
long total = searchResponse.getHits().getTotalHits().value;
Map<String,Object> result = new HashMap<>();
result.put("total", total);
result.put("content", list);
return result;
}
public Map<String, Object> searchByScrollPage(String keywords, String scrollId, Integer pageNum, Integer pageSize) throws IOException {
SearchResponse searchResponse = null;
if(ObjectUtil.isEmpty(scrollId)){
SearchRequest searchRequest = new SearchRequest("indexName");
// 用于构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "username");
searchSourceBuilder.query(multiMatchQueryBuilder);
// 分页
searchSourceBuilder.size(pageSize);
searchSourceBuilder.from((pageNum - 1) * pageSize);
// 设置高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("username");
highlightBuilder.preTags("<font color='red'>");
highlightBuilder.postTags("</font>");
searchSourceBuilder.highlighter(highlightBuilder);
searchRequest.source(searchSourceBuilder);
// 设置scroll 值
searchRequest.scroll(TimeValue.timeValueMinutes(5));
searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
}else {
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueMinutes(5));
searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
}
SearchHit[] searchHits = searchResponse.getHits().getHits();
List<Object> list = new ArrayList<>();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSourceAsString();
Object object = JSONObject.parseObject(source, Object.class);
// 高亮
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
HighlightField username = highlightFields.get("username");
if(username != null){
// 获取指定字段个高亮部门
Text[] fragments = username.getFragments();
// 将高亮部门拼接成一个完整的高亮片段
StringBuilder sb = new StringBuilder();
for (Text fragment : fragments) {
sb.append(fragment);
}
sb.toString();// 高亮部分
}
list.add(object);
}
long total = searchResponse.getHits().getTotalHits().value;
Map<String,Object> result = new HashMap<>();
result.put("scrollId", searchResponse.getScrollId());
result.put("total", total);
result.put("content", list);
return result;
}