1. 程式人生 > >springboot整合elasticsearch-6.2.3

springboot整合elasticsearch-6.2.3

@Component
public class ElasticsearchUtil {

private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchUtil.class);
@Autowired
private TransportClient transportClient;
private static TransportClient client;
/**
* @PostContructspring框架的註解
* spring容器初始化的時候執行該方法
*/
@PostConstruct
public void
init() {
client = this.transportClient;
}

/**
* 建立索引
*
* @param index
* @return
*/
public static boolean createIndex(String index) {
if (!isIndexExist(index)) {
LOGGER.info("Index is not exits!");
}
CreateIndexResponse indexresponse = client.admin().indices().prepareCreate(index).execute().actionGet();
LOGGER.info("執行建立成功?" + indexresponse.isAcknowledged());
return indexresponse.isAcknowledged();
}

/**
* 刪除索引
*
* @param index
* @return
*/
public static boolean deleteIndex(String index) {
if (!isIndexExist(index)) {
LOGGER.info("Index is not exits!");
}
DeleteIndexResponse dResponse = client
.admin().indices().prepareDelete(index).execute().actionGet();
if (dResponse.isAcknowledged()) {
LOGGER.info("delete index " + index + " successfully!");
} else {
LOGGER.info("Fail to delete index " + index);
}
return dResponse.isAcknowledged();
}

/**
* 判斷索引是否存在
*
* @param index
* @return
*/
public static boolean isIndexExist(String index) {
IndicesExistsResponse inExistsResponse = client.admin().indices().exists(new IndicesExistsRequest(index)).actionGet();
if (inExistsResponse.isExists()) {
LOGGER.info("Index [" + index + "] is exist!");
} else {
LOGGER.info("Index [" + index + "] is not exist!");
}
return inExistsResponse.isExists();
}

/**
* 資料新增,正定ID
*
* @param jsonObject 要增加的資料
* @param index 索引,類似資料庫
* @param type 型別,類似表
* @param id 資料ID
* @return
*/
public static String addData(JSONObject jsonObject, String index, String type, String id) {

IndexResponse response = client.prepareIndex(index, type, id).setSource(jsonObject).get();
LOGGER.info("addData response status:{},id:{}", response.status().getStatus(), response.getId());
return response.getId();
}

/**
* 資料新增
*
* @param jsonObject 要增加的資料
* @param index 索引,類似資料庫
* @param type 型別,類似表
* @return
*/
public static String addData(JSONObject jsonObject, String index, String type) {
return addData(jsonObject, index, type, UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
}

/**
* 通過ID刪除資料
*
* @param index 索引,類似資料庫
* @param type 型別,類似表
* @param id 資料ID
*/
public static void deleteDataById(String index, String type, String id) {

DeleteResponse response = client.prepareDelete(index, type, id).execute().actionGet();
LOGGER.info("deleteDataById response status:{},id:{}", response.status().getStatus(), response.getId());
}

/**
* 通過ID 更新資料
*
* @param jsonObject 要增加的資料
* @param index 索引,類似資料庫
* @param type 型別,類似表
* @param id 資料ID
* @return
*/
public static void updateDataById(JSONObject jsonObject, String index, String type, String id) {

UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index(index).type(type).id(id).doc(jsonObject);
client.update(updateRequest);
}

/**
* 通過ID獲取資料
*
* @param index 索引,類似資料庫
* @param type 型別,類似表
* @param id 資料ID
* @param fields 需要顯示的欄位,逗號分隔(預設為全部欄位)
* @return
*/
public static Map<String, Object> searchDataById(String index, String type, String id, String fields) {

GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id);
if (StringUtils.isNotEmpty(fields)) {
getRequestBuilder.setFetchSource(fields.split(","), null);
}

GetResponse getResponse = getRequestBuilder.execute().actionGet();
return getResponse.getSource();
}


/**
* 使用分詞查詢,並分頁
*
* @param index 索引名稱
* @param type 型別名稱,可傳入多個type逗號分隔
* @param startPage 當前頁
* @param pageSize 每頁顯示條數
* @param query 查詢條件
* @param fields 需要顯示的欄位,逗號分隔(預設為全部欄位)
* @param sortField 排序欄位
* @param highlightField 高亮欄位
* @return
*/
public static EsPage searchDataPage(String index, String type, int startPage, int pageSize, QueryBuilder query, String fields, String sortField, String highlightField) {
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
if (StringUtils.isNotEmpty(type)) {
searchRequestBuilder.setTypes(type.split(","));
}
searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH);
// 需要顯示的欄位,逗號分隔(預設為全部欄位)
if (StringUtils.isNotEmpty(fields)) {
searchRequestBuilder.setFetchSource(fields.split(","), null);
}

//排序欄位
if (StringUtils.isNotEmpty(sortField)) {
searchRequestBuilder.addSort(sortField, SortOrder.DESC);
}

// 高亮(xxx=111,aaa=222
if (StringUtils.isNotEmpty(highlightField)) {
HighlightBuilder highlightBuilder = new HighlightBuilder();
//highlightBuilder.preTags("<span style='color:red' >");//設定字首
//highlightBuilder.postTags("</span>");//設定字尾
// 設定高亮欄位
highlightBuilder.field(highlightField);
searchRequestBuilder.highlighter(highlightBuilder);
}

//searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
searchRequestBuilder.setQuery(query);
// 分頁應用
searchRequestBuilder.setFrom(startPage).setSize(pageSize);
// 設定是否按查詢匹配度排序
searchRequestBuilder.setExplain(true);
//列印的內容 可以在 Elasticsearch head Kibana 上執行查詢
LOGGER.info("\n{}", searchRequestBuilder);
// 執行搜尋,返回搜尋響應資訊
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
long totalHits = searchResponse.getHits().totalHits;
long length = searchResponse.getHits().getHits().length;
LOGGER.debug("共查詢到[{}]條資料,處理資料條數[{}]", totalHits, length);
if (searchResponse.status().getStatus() == 200) {
// 解析物件
List<Map<String, Object>> sourceList = setSearchResponse(searchResponse, highlightField);
return new EsPage(startPage, pageSize, (int) totalHits, sourceList);
}

return null;
}


/**
* 使用分詞查詢
*
* @param index 索引名稱
* @param type 型別名稱,可傳入多個type逗號分隔
* @param query 查詢條件
* @param size 文件大小限制
* @param fields 需要顯示的欄位,逗號分隔(預設為全部欄位)
* @param sortField 排序欄位
* @param highlightField 高亮欄位
* @return
*/
public static List<Map<String, Object>> searchListData(String index, String type, QueryBuilder query, Integer size, String fields, String sortField, String highlightField) {

SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
if (StringUtils.isNotEmpty(type)) {
searchRequestBuilder.setTypes(type.split(","));
}

if (StringUtils.isNotEmpty(highlightField)) {
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 設定高亮欄位
highlightBuilder.field(highlightField);
searchRequestBuilder.highlighter(highlightBuilder);
}

searchRequestBuilder.setQuery(query);
if (StringUtils.isNotEmpty(fields)) {
searchRequestBuilder.setFetchSource(fields.split(","), null);
}
searchRequestBuilder.setFetchSource(true);
if (StringUtils.isNotEmpty(sortField)) {
searchRequestBuilder.addSort(sortField, SortOrder.DESC);
}

if (size != null && size > 0) {
searchRequestBuilder.setSize(size);
}

//列印的內容 可以在 Elasticsearch head Kibana 上執行查詢
LOGGER.info("\n{}", searchRequestBuilder);
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
long totalHits = searchResponse.getHits().totalHits;
long length = searchResponse.getHits().getHits().length;
LOGGER.info("共查詢到[{}]條資料,處理資料條數[{}]", totalHits, length);
if (searchResponse.status().getStatus() == 200) {
// 解析物件
return setSearchResponse(searchResponse, highlightField);
}

return null;
}



/**
* 高亮結果集 特殊處理
*
* @param searchResponse
* @param highlightField
*/
private static List<Map<String, Object>> setSearchResponse(SearchResponse searchResponse, String highlightField) {
List<Map<String, Object>> sourceList = new ArrayList<Map<String, Object>>();
StringBuffer stringBuffer = new StringBuffer();
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
searchHit.getSourceAsMap().put("id", searchHit.getId());
if (StringUtils.isNotEmpty(highlightField)) {

System.out.println("遍歷 高亮結果集,覆蓋 正常結果集" + searchHit.getSourceAsMap());
Text[] text = searchHit.getHighlightFields().get(highlightField).getFragments();
if (text != null) {
for (Text str : text) {
stringBuffer.append(str.string());
}
//遍歷 高亮結果集,覆蓋 正常結果集
searchHit.getSourceAsMap().put(highlightField, stringBuffer.toString());
}
}
sourceList.add(searchHit.getSourceAsMap());
}

return sourceList;
}

}