|
|
package com.sunyo.wlpt.message.bus.service.service.impl;
|
|
|
|
|
|
import com.sunyo.wlpt.message.bus.service.domain.MessageNote;
|
|
|
import com.sunyo.wlpt.message.bus.service.elasticsearch.dao.MessageNoteRepository;
|
|
|
import com.sunyo.wlpt.message.bus.service.response.ResultJson;
|
|
|
import com.sunyo.wlpt.message.bus.service.utils.DateUtils;
|
|
|
import io.netty.util.internal.StringUtil;
|
|
|
import org.elasticsearch.action.search.SearchRequest;
|
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
|
import org.elasticsearch.client.RequestOptions;
|
|
|
import org.elasticsearch.client.RestHighLevelClient;
|
|
|
import org.elasticsearch.common.unit.TimeValue;
|
|
|
import org.elasticsearch.index.query.*;
|
|
|
import org.elasticsearch.search.SearchHit;
|
|
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
|
|
import org.elasticsearch.search.sort.SortOrder;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.data.domain.PageRequest;
|
|
|
import org.springframework.data.domain.Sort;
|
|
|
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.io.IOException;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
|
* @author 子诚
|
|
|
* Description:
|
|
|
* 时间:2020/8/5 14:08
|
|
|
*/
|
|
|
@Component
|
|
|
public class ElasticsearchService {
|
|
|
|
|
|
/**
|
|
|
* 这里不能使用@Resource,必须使用@Autowired
|
|
|
* 原因:I don`t know
|
|
|
*/
|
|
|
@Resource
|
|
|
private ElasticsearchRestTemplate elasticsearchRestTemplate;
|
|
|
|
|
|
@Resource
|
|
|
private RestHighLevelClient restHighLevelClient;
|
|
|
|
|
|
@Resource
|
|
|
private MessageNoteRepository messageNoteRepository;
|
|
|
|
|
|
|
|
|
public ResultJson selectMessageNoteList(MessageNote messageNote, Integer pageNum, Integer pageSize) throws IOException
|
|
|
{
|
|
|
// 条件搜索
|
|
|
SearchRequest searchRequest = new SearchRequest("message_note");
|
|
|
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
|
|
|
|
|
|
// 高亮设置
|
|
|
HighlightBuilder highlightBuilder = new HighlightBuilder();
|
|
|
|
|
|
// 高亮字段,不设置
|
|
|
highlightBuilder.field("*").requireFieldMatch(false);
|
|
|
/*高亮前缀标签
|
|
|
.preTags("<span style='color=green'>")
|
|
|
// 高亮后缀标签
|
|
|
.postTags("</span>");
|
|
|
*/
|
|
|
|
|
|
// 分页
|
|
|
sourceBuilder
|
|
|
.from((pageNum - 1) * pageSize)
|
|
|
.size(pageSize)
|
|
|
// 检索所有字段
|
|
|
.postFilter(QueryBuilders.matchAllQuery())
|
|
|
.sort("sendTime", SortOrder.DESC)
|
|
|
.highlighter(new HighlightBuilder().
|
|
|
field("*").
|
|
|
requireFieldMatch(false));
|
|
|
|
|
|
|
|
|
if (StringUtil.isNullOrEmpty(messageNote.getUsername())
|
|
|
&& StringUtil.isNullOrEmpty(messageNote.getServerName())
|
|
|
&& StringUtil.isNullOrEmpty(messageNote.getVirtualHostName())
|
|
|
&& StringUtil.isNullOrEmpty(messageNote.getExchangeName())
|
|
|
&& StringUtil.isNullOrEmpty(messageNote.getRoutingKeyName())
|
|
|
&& messageNote.getSendTimeBegin() == null
|
|
|
&& messageNote.getSendTimeEnd() == null) {
|
|
|
sourceBuilder.query(QueryBuilders.matchAllQuery());
|
|
|
} else {
|
|
|
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
|
|
|
if (!StringUtil.isNullOrEmpty(messageNote.getUsername())) {
|
|
|
WildcardQueryBuilder usernameQuery = QueryBuilders.wildcardQuery("username", messageNote.getUsername());
|
|
|
boolQueryBuilder.must(usernameQuery);
|
|
|
}
|
|
|
if (!StringUtil.isNullOrEmpty(messageNote.getServerName())) {
|
|
|
WildcardQueryBuilder serverNameQuery = QueryBuilders.wildcardQuery("serverName", messageNote.getServerName());
|
|
|
boolQueryBuilder.must(serverNameQuery);
|
|
|
}
|
|
|
if (!StringUtil.isNullOrEmpty(messageNote.getVirtualHostName())) {
|
|
|
WildcardQueryBuilder virtualHostNameQuery = QueryBuilders.wildcardQuery("virtualHostName", messageNote.getVirtualHostName());
|
|
|
boolQueryBuilder.must(virtualHostNameQuery);
|
|
|
}
|
|
|
if (!StringUtil.isNullOrEmpty(messageNote.getExchangeName())) {
|
|
|
WildcardQueryBuilder exchangeNameQuery = QueryBuilders.wildcardQuery("exchangeName", messageNote.getExchangeName());
|
|
|
boolQueryBuilder.must(exchangeNameQuery);
|
|
|
}
|
|
|
if (!StringUtil.isNullOrEmpty(messageNote.getRoutingKeyName())) {
|
|
|
WildcardQueryBuilder routingKeyNameQuery = QueryBuilders.wildcardQuery("routingKeyName", messageNote.getRoutingKeyName());
|
|
|
boolQueryBuilder.must(routingKeyNameQuery);
|
|
|
}
|
|
|
if (messageNote.getSendTimeBegin() != null && messageNote.getSendTimeEnd() != null) {
|
|
|
RangeQueryBuilder sendTimeQuery = QueryBuilders.rangeQuery("sendTime")
|
|
|
.from(messageNote.getSendTimeBegin(), true)
|
|
|
.to(DateUtils.addDays(messageNote.getSendTimeEnd(), 1), true);
|
|
|
boolQueryBuilder.must(sendTimeQuery);
|
|
|
}
|
|
|
if (messageNote.getSendTimeBegin() != null && messageNote.getSendTimeEnd() == null) {
|
|
|
RangeQueryBuilder sendTimeQuery = QueryBuilders.rangeQuery("sendTime")
|
|
|
.gte(messageNote.getSendTimeBegin());
|
|
|
boolQueryBuilder.must(sendTimeQuery);
|
|
|
}
|
|
|
if (messageNote.getSendTimeBegin() == null && messageNote.getSendTimeEnd() != null) {
|
|
|
RangeQueryBuilder sendTimeQuery = QueryBuilders.rangeQuery("sendTime")
|
|
|
.lte(DateUtils.addDays(messageNote.getSendTimeEnd(), 1));
|
|
|
boolQueryBuilder.must(sendTimeQuery);
|
|
|
}
|
|
|
|
|
|
sourceBuilder.query(boolQueryBuilder);
|
|
|
}
|
|
|
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
|
|
|
|
|
|
|
|
|
// 执行搜索
|
|
|
searchRequest.source(sourceBuilder);
|
|
|
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
|
|
|
|
|
|
// 解析结果
|
|
|
List<Map<String, Object>> list = new ArrayList<>();
|
|
|
for (SearchHit hit : searchResponse.getHits().getHits()) {
|
|
|
// 原来的结果
|
|
|
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
|
|
|
sourceAsMap.get("sendTime");
|
|
|
System.out.println(sourceAsMap.get("sendTime"));
|
|
|
|
|
|
/* 解析高亮的字段
|
|
|
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
|
|
|
HighlightField username = highlightFields.get("username");
|
|
|
if (username != null) {
|
|
|
// 取出该字段
|
|
|
Text[] fragments = username.fragments();
|
|
|
// 将高亮字段替换原来没有高亮的字段
|
|
|
String user_name = "";
|
|
|
for (Text text : fragments) {
|
|
|
user_name += text; }
|
|
|
// 将高亮字段替换原来的内容
|
|
|
sourceAsMap.put("username", user_name);
|
|
|
}
|
|
|
*/
|
|
|
list.add(sourceAsMap);
|
|
|
}
|
|
|
Integer total = Math.toIntExact(searchResponse.getHits().getTotalHits().value);
|
|
|
return total > 0
|
|
|
? new ResultJson<>("200", "ES分页查询成功", list, total)
|
|
|
: new ResultJson<>("500", "ES分页查询失败");
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 保存或者更新一条文档,于ES服务器中
|
|
|
*
|
|
|
* @param messageNote {@link MessageNote}
|
|
|
*/
|
|
|
public void saveOrUpdateMessageNote(MessageNote messageNote)
|
|
|
{
|
|
|
// id,存在即是更新;id不存在即是保存
|
|
|
messageNoteRepository.save(messageNote);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据Id,删除ES中的一条文档
|
|
|
*
|
|
|
* @param id 消息记录id
|
|
|
*/
|
|
|
public void deleteMessageNoteById(String id)
|
|
|
{
|
|
|
messageNoteRepository.deleteById(id);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 清空所有文档
|
|
|
*/
|
|
|
public void deleteAllMessageNote()
|
|
|
{
|
|
|
messageNoteRepository.deleteAll();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据id查询
|
|
|
*/
|
|
|
public void selectById(String id)
|
|
|
{
|
|
|
Optional<MessageNote> optionalMessageNote = messageNoteRepository.findById(id);
|
|
|
MessageNote messageNote = optionalMessageNote.get();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询所有
|
|
|
*/
|
|
|
public List<MessageNote> selectAll()
|
|
|
{
|
|
|
Iterable<MessageNote> gets = messageNoteRepository.findAll(Sort.by(Sort.Order.desc("gmtCreate")));
|
|
|
List<MessageNote> list = new ArrayList<>();
|
|
|
for (MessageNote get : gets) {
|
|
|
list.add(get);
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 分页查询
|
|
|
*
|
|
|
* @param pageNum 当前页-1
|
|
|
* @param pageSize 每页数量
|
|
|
* @return
|
|
|
*/
|
|
|
public List<MessageNote> selectByPage(Integer pageNum, Integer pageSize)
|
|
|
{
|
|
|
List<MessageNote> list = new ArrayList<>();
|
|
|
Page<MessageNote> pages = messageNoteRepository.search(QueryBuilders.matchAllQuery(), PageRequest.of(pageNum - 1,
|
|
|
pageSize));
|
|
|
for (MessageNote note : pages) {
|
|
|
list.add(note);
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
|
|
|
} |
...
|
...
|
|