//package com.walker.support.es.impl;
|
//
|
//import com.walker.support.es.dao.SearchDao;
|
//import com.walker.support.es.so.BaseSearchObject;
|
//import com.xinyuan.core.common.MisException;
|
//import com.xinyuan.core.common.SplitPageInfo;
|
//import com.xinyuan.core.persistence.search.dao.SearchDao;
|
//import com.xinyuan.core.persistence.search.dao.SearchParameter;
|
//import com.xinyuan.core.persistence.search.so.BaseSearchObject;
|
//import org.apache.commons.beanutils.BeanMap;
|
//import org.apache.commons.lang.StringUtils;
|
//import org.elasticsearch.action.index.IndexRequest;
|
//import org.elasticsearch.action.search.SearchRequestBuilder;
|
//import org.elasticsearch.action.search.SearchResponse;
|
//import org.elasticsearch.common.xcontent.XContentBuilder;
|
//import org.elasticsearch.common.xcontent.XContentFactory;
|
//import org.elasticsearch.index.query.QueryBuilder;
|
//import org.elasticsearch.index.query.QueryBuilders;
|
//import org.elasticsearch.search.aggregations.AggregationBuilder;
|
//import org.elasticsearch.search.aggregations.Aggregations;
|
//import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
//import org.elasticsearch.search.sort.SortOrder;
|
//import org.elasticsearch.xcontent.XContentBuilder;
|
//import org.elasticsearch.xcontent.XContentFactory;
|
//import org.json.JSONArray;
|
//import org.json.JSONObject;
|
//import org.slf4j.Logger;
|
//import org.slf4j.LoggerFactory;
|
//import org.springframework.beans.factory.annotation.Autowired;
|
//import org.springframework.cglib.beans.BeanMap;
|
//import org.springframework.data.domain.Page;
|
//import org.springframework.data.domain.PageRequest;
|
//import org.springframework.data.domain.Sort;
|
//import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
|
//import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
|
//import org.springframework.data.elasticsearch.core.ResultsMapper;
|
//import org.springframework.data.elasticsearch.core.SearchResultMapper;
|
//import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
//import org.springframework.data.elasticsearch.core.query.*;
|
//import org.springframework.stereotype.Repository;
|
//import org.springframework.util.Assert;
|
//
|
//import java.util.ArrayList;
|
//import java.util.Iterator;
|
//import java.util.List;
|
//import java.util.Map;
|
//import java.util.regex.Pattern;
|
//
|
///**
|
// * 索引访问对象
|
// *
|
// * @author 李志慧
|
// * @date 2017年3月22日
|
// */
|
//@Repository
|
//public class SearchDaoImpl implements SearchDao {
|
// /**
|
// * 日志
|
// */
|
// private static final Logger logger = LoggerFactory.getLogger(SearchDaoImpl.class);
|
// /**
|
// * 替换标记模式
|
// */
|
// private static final Pattern PARAMETER_PLACEHOLDER = Pattern.compile("\"?\\?([a-zA-Z_][a-zA-Z0-9_]*)\"?");
|
//
|
// /**
|
// * 默认最多返回10000条记录
|
// */
|
// private static final int PAGE_SIZE = 3000;
|
//
|
// /**
|
// * 结果转换工具
|
// */
|
// @Autowired
|
// private ResultsMapper resultsMapper;
|
//
|
// /**
|
// * elasticsearch操作模板类
|
// */
|
// @Autowired
|
// private ElasticsearchTemplate elasticsearchTemplate;
|
//
|
// @Override
|
// public <SO extends BaseSearchObject> void insert(SO so) {
|
// if (so != null) {
|
// this.elasticsearchTemplate.index(buildIndexQuery(so));
|
// }
|
// }
|
//
|
// @Override
|
// public <SO extends BaseSearchObject> void insert(List<SO> soList) {
|
// if (soList != null) {
|
// List<IndexQuery> list = new ArrayList<>();
|
// for (SO so : soList) {
|
// if (so != null) {
|
// list.add(buildIndexQuery(so));
|
// }
|
// //logger.info("-->{}", ToStringBuilder.reflectionToString(new IndexQueryBuilder().withId(so.getId()).withObject(so).build()));
|
// }
|
// this.elasticsearchTemplate.bulkIndex(list);
|
// }
|
// }
|
//
|
// /**
|
// * 创建IndexQuery
|
// *
|
// * @param so 搜索对象
|
// * @param <SO> 对象类型
|
// * @return 索引处理对象
|
// */
|
// private <SO extends BaseSearchObject> IndexQuery buildIndexQuery(SO so) {
|
// return new IndexQueryBuilder().withId(so.getId()).withObject(so).build();
|
// }
|
//
|
// @Override
|
// public <SO extends BaseSearchObject> void update(SO so) {
|
// if (so != null) {
|
// this.elasticsearchTemplate.update(buildUpdateQuery(so));
|
// }
|
// }
|
//
|
// @Override
|
// public <SO extends BaseSearchObject> void update(List<SO> soList) {
|
// if (soList != null) {
|
// List<UpdateQuery> list = new ArrayList<>();
|
// for (SO so : soList) {
|
// if (so != null) {
|
// list.add(buildUpdateQuery(so));
|
// }
|
// }
|
// this.elasticsearchTemplate.bulkUpdate(list);
|
// }
|
// }
|
//
|
// /**
|
// * 创建更新对象
|
// *
|
// * @param so 索引对象
|
// * @param <SO> BaseSearchObject 子类型
|
// * @return UpdateQuery
|
// */
|
// private <SO extends BaseSearchObject> UpdateQuery buildUpdateQuery(SO so) {
|
// try {
|
// IndexRequest indexRequest = new IndexRequest();
|
// indexRequest.id(so.getId());
|
// indexRequest.source(new BeanMap(so));
|
//
|
// UpdateQueryBuilder uqb = new UpdateQueryBuilder();
|
// uqb.withId(so.getId())
|
// .withClass(so.getClass())
|
// .withIndexRequest(indexRequest)
|
// .withDoUpsert(true);
|
// return uqb.build();
|
// } catch (Exception e) {
|
// throw new MisException(e);
|
// }
|
// }
|
//
|
//
|
// @Override
|
// public <SO extends BaseSearchObject> void delete(SO so) {
|
// if (so != null) {
|
// this.elasticsearchTemplate.delete(so.getClass(), so.getId());
|
// }
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> void deleteAll(Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
// DeleteQuery deleteQuery = new DeleteQuery();
|
// deleteQuery.setQuery(QueryBuilders.matchAllQuery());
|
// this.elasticsearchTemplate.delete(deleteQuery, clazz);
|
// this.elasticsearchTemplate.refresh(clazz);
|
// }
|
//
|
// @Override
|
// public <SO extends BaseSearchObject> void delete(List<SO> soList) {
|
// if (soList != null) {
|
// for (SO so : soList) {
|
// this.delete(so);
|
// }
|
// }
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> T get(Class<T> clazz, String id) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
// if (StringUtils.isNotBlank(id)) {
|
// GetQuery getQuery = new GetQuery();
|
// getQuery.setId(id);
|
// return this.elasticsearchTemplate.queryForObject(getQuery, clazz);
|
// } else {
|
// return null;
|
// }
|
// }
|
//
|
// @Override
|
// @Deprecated
|
// public <T extends BaseSearchObject> List<T> select(Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
// SearchQuery searchQuery = new NativeSearchQueryBuilder()
|
// .withQuery(QueryBuilders.matchAllQuery())
|
// .withPageable(PageRequest.of(0, PAGE_SIZE))
|
// //.withSort(SortBuilders.fieldSort("id"))
|
// .build();
|
// return this.elasticsearchTemplate.queryForList(searchQuery, clazz);
|
// }
|
//
|
//
|
// @Override
|
// @Deprecated
|
// public <T extends BaseSearchObject> List<T> select(SplitPageInfo splitPageInfo, Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
// SearchQuery searchQuery = new NativeSearchQueryBuilder()
|
// .withQuery(QueryBuilders.matchAllQuery())
|
// .withPageable(PageRequest.of(splitPageInfo.getCurrentPage() - 1, splitPageInfo.getPageSize()))
|
// //.withSort(SortBuilders.fieldSort("id"))
|
// .build();
|
// splitPageInfo.setTotalRowsAmount(count(new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).build(), clazz));
|
// return this.elasticsearchTemplate.queryForList(searchQuery, clazz);
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> List<T> select(QueryBuilder queryBuilder, SearchParameter searchParameter, Class<T> clazz) {
|
// return this.select(queryBuilder, searchParameter, null, clazz);
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> List<T> select(QueryBuilder queryBuilder, SearchParameter searchParameter, SplitPageInfo splitPageInfo, Class<T> clazz) {
|
// Assert.notNull(queryBuilder, "jsonQuery不能为空!");
|
//
|
// logger.debug("searchParameter : {}", searchParameter);
|
// logger.debug("splitPageInfo : {}", splitPageInfo);
|
// logger.debug("clazz : {}", clazz);
|
//
|
// ElasticsearchPersistentEntity persistentEntity = this.elasticsearchTemplate.getPersistentEntityFor(clazz);
|
// String index = persistentEntity.getIndexName();
|
// String type = persistentEntity.getIndexType();
|
// SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
|
// searchQuery.addIndices(index);
|
// searchQuery.addTypes(type);
|
// if (splitPageInfo != null) {
|
// searchQuery.setPageable(PageRequest.of(Math.max(splitPageInfo.getCurrentPage() - 1, 0), splitPageInfo.getPageSize()));
|
// } else {
|
// searchQuery.setPageable(PageRequest.of(0, PAGE_SIZE));
|
// }
|
//
|
// Page<T> page = this.queryForPage(searchQuery, searchParameter, clazz, resultsMapper);
|
// if (splitPageInfo != null) {
|
// splitPageInfo.setTotalRowsAmount((int) page.getTotalElements());
|
// }
|
//
|
// return page.getContent();
|
// }
|
//
|
// /**
|
// * 分页查询索引
|
// *
|
// * @param query 字符串查询对象
|
// * @param searchParameter 索引参数对象
|
// * @param clazz 索引对象类型
|
// * @param mapper 查询结果转换对象
|
// * @param <T> BaseSearchObject 子类型
|
// * @return 分页结果
|
// */
|
// private <T> Page<T> queryForPage(SearchQuery query, SearchParameter searchParameter, Class<T> clazz, SearchResultMapper mapper) {
|
// SearchRequestBuilder searchRequestBuilder = prepareSearch(query);
|
// searchRequestBuilder.setQuery(query.getQuery());
|
// this.handleSearchParameter(searchRequestBuilder, searchParameter);
|
// logger.info("searchRequestBuilder->{}", searchRequestBuilder);
|
// SearchResponse response = searchRequestBuilder.execute().actionGet();
|
// return mapper.mapResults(response, clazz, query.getPageable());
|
// }
|
//
|
// /**
|
// * 处理查询参数
|
// *
|
// * @param searchRequestBuilder 查询请求创建对象
|
// * @param searchParameter 查询参数
|
// */
|
// private void handleSearchParameter(SearchRequestBuilder searchRequestBuilder, SearchParameter searchParameter) {
|
// if (searchParameter != null) {
|
// // 高亮字段
|
// HighlightBuilder highlightBuilder = new HighlightBuilder();
|
// if (searchParameter.getHighlightedFields() != null) {
|
// for (String field : searchParameter.getHighlightedFields()) {
|
// highlightBuilder.field(field).requireFieldMatch(false);
|
// }
|
// }
|
//
|
// // 高亮起始标签
|
// if (StringUtils.isNotEmpty(searchParameter.getHighlighterPreTags())) {
|
// highlightBuilder.preTags(searchParameter.getHighlighterPreTags());
|
// }
|
//
|
// // 高亮结束标签
|
// if (StringUtils.isNotEmpty(searchParameter.getHighlighterPostTags())) {
|
// highlightBuilder.postTags(searchParameter.getHighlighterPostTags());
|
// }
|
//
|
// // 高亮片段大小
|
// if (searchParameter.getHighlighterFragmentSize() != null) {
|
// highlightBuilder.fragmentSize(searchParameter.getHighlighterFragmentSize());
|
// }
|
//
|
// // 高亮片段数量
|
// if (searchParameter.getHighlighterNumOfFragments() != null) {
|
// highlightBuilder.numOfFragments(searchParameter.getHighlighterNumOfFragments());
|
// }
|
// searchRequestBuilder.highlighter(highlightBuilder);
|
// // 包含和不包含字段的设置
|
// searchRequestBuilder.setFetchSource(searchParameter.getFetchSourceIncludes(), searchParameter.getFetchSourceExcludes());
|
//
|
// // 排序
|
// if (searchParameter.getFieldOrderList() != null) {
|
// for (SearchParameter.FieldOrder fieldOrder : searchParameter.getFieldOrderList()) {
|
// switch (fieldOrder.getOrder()) {
|
// case ASC:
|
// searchRequestBuilder.addSort(fieldOrder.getField(), SortOrder.ASC);
|
// break;
|
// case DESC:
|
// searchRequestBuilder.addSort(fieldOrder.getField(), SortOrder.DESC);
|
// break;
|
// default:
|
// searchRequestBuilder.addSort(fieldOrder.getField(), SortOrder.ASC);
|
// }
|
// }
|
// }
|
// }
|
// }
|
//
|
// /**
|
// * 查询准备,创建查询请求创建对象
|
// *
|
// * @param query 查询对象
|
// * @return 询请求创建对象
|
// */
|
// private SearchRequestBuilder prepareSearch(Query query) {
|
// Assert.notNull(query.getIndices(), "No index defined for Query");
|
// Assert.notNull(query.getTypes(), "No type defined for Query");
|
//
|
// int startRecord = 0;
|
// SearchRequestBuilder searchRequestBuilder = this.elasticsearchTemplate
|
// .getClient()
|
// .prepareSearch(query.getIndices().toArray(new String[query.getIndices().size()]))
|
// .setSearchType(query.getSearchType())
|
// .setTypes(query.getTypes().toArray(new String[query.getTypes().size()]));
|
//
|
// if (query.getSourceFilter() != null) {
|
// SourceFilter sourceFilter = query.getSourceFilter();
|
// searchRequestBuilder.setFetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes());
|
// }
|
//
|
// if (query.getPageable() != null) {
|
// startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize();
|
// searchRequestBuilder.setSize(query.getPageable().getPageSize());
|
// }
|
// searchRequestBuilder.setFrom(startRecord);
|
//
|
// if (!query.getFields().isEmpty()) {
|
// searchRequestBuilder.storedFields(query.getFields().toArray(new String[query.getFields().size()]));
|
// }
|
//
|
// if (query.getSort() != null) {
|
// for (Sort.Order order : query.getSort()) {
|
// searchRequestBuilder.addSort(order.getProperty(), order.getDirection() == Sort.Direction.DESC ? SortOrder.DESC : SortOrder.ASC);
|
// }
|
// }
|
//
|
// if (query.getMinScore() > 0) {
|
// searchRequestBuilder.setMinScore(query.getMinScore());
|
// }
|
//
|
// return searchRequestBuilder;
|
// }
|
//
|
// /**
|
// * 根据查询条件获取索引数量
|
// *
|
// * @param searchQuery 查询对象
|
// * @param clazz 索引对象类型
|
// * @param <T> BaseSearchObject 子类型
|
// * @return 索引数量
|
// */
|
// private <T extends BaseSearchObject> int count(SearchQuery searchQuery, Class<T> clazz) {
|
// return (int) this.elasticsearchTemplate.count(searchQuery, clazz);
|
// }
|
//
|
//
|
// @Override
|
// public <T extends BaseSearchObject> boolean deleteIndex(Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
// return this.elasticsearchTemplate.deleteIndex(clazz);
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> boolean createIndex(Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
// return this.elasticsearchTemplate.indexExists(clazz) || this.elasticsearchTemplate.createIndex(clazz);
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> boolean putMapping(Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
//
|
// ElasticsearchPersistentEntity persistentEntity = this.elasticsearchTemplate.getPersistentEntityFor(clazz);
|
// String index = persistentEntity.getIndexName();
|
// String type = persistentEntity.getIndexType();
|
// return this.elasticsearchTemplate.typeExists(index, type) || this.elasticsearchTemplate.putMapping(clazz);
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> void refresh(Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
// this.elasticsearchTemplate.refresh(clazz);
|
// }
|
//
|
// @Override
|
// public <T extends BaseSearchObject> Map aggs(AggregationBuilder abstractRangeBuilder, QueryBuilder queryBuilder, Class<T> clazz) {
|
// Assert.notNull(clazz, "clazz不能为空!");
|
//
|
// ElasticsearchPersistentEntity persistentEntity = this.elasticsearchTemplate.getPersistentEntityFor(clazz);
|
// String index = persistentEntity.getIndexName();
|
// String type = persistentEntity.getIndexType();
|
// SearchRequestBuilder searchRequestBuilder = this.elasticsearchTemplate
|
// .getClient()
|
// .prepareSearch(index)
|
// .setTypes(type);
|
// searchRequestBuilder.setSize(0);
|
// searchRequestBuilder.setQuery(queryBuilder);
|
// searchRequestBuilder.addAggregation(abstractRangeBuilder);
|
// SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
|
// Aggregations aggregations = searchResponse.getAggregations();
|
// return aggregations == null ? null : aggregations.asMap();
|
//
|
// }
|
//
|
//
|
//
|
// private XContentBuilder convert(Object obj) {
|
// try {
|
// XContentBuilder builder = XContentFactory.jsonBuilder();
|
// if (obj == null) {
|
// return null;
|
// }
|
//
|
// if (obj instanceof JSONObject) {
|
// builder.startObject();
|
// Iterator<String> it = ((JSONObject) obj).keys();
|
// while (it.hasNext()) {
|
// String field = it.next();
|
// visit(builder, field, ((JSONObject) obj).get(field));
|
// }
|
// builder.endObject();
|
// }
|
//
|
// if (obj instanceof JSONArray) {
|
// builder.startArray();
|
// for (int i = 0; i < ((JSONArray) obj).length(); i++) {
|
// visit(builder, null, ((JSONArray) obj).get(i));
|
// }
|
// builder.endArray();
|
// }
|
//
|
// return builder;
|
// } catch (Exception e) {
|
// throw new MisException(e);
|
// }
|
// }
|
//
|
// private void visit(XContentBuilder builder, String field, Object obj) throws Exception {
|
// if (field == null) {
|
// if (obj instanceof JSONObject) {
|
// builder.startObject();
|
// Iterator<String> it = ((JSONObject) obj).keys();
|
// while (it.hasNext()) {
|
// String next = it.next();
|
// visit(builder, null, ((JSONObject) obj).get(next));
|
// }
|
// builder.endObject();
|
// } else if (obj instanceof JSONArray) {
|
// builder.startArray();
|
// for (int i = 0; i < ((JSONArray) obj).length(); i++) {
|
// visit(builder, null, ((JSONArray) obj).get(i));
|
// }
|
// builder.endArray();
|
// } else {
|
// builder.value(obj);
|
// }
|
// } else {
|
// if (obj instanceof JSONObject) {
|
// builder.startObject(field);
|
// Iterator<String> it = ((JSONObject) obj).keys();
|
// while (it.hasNext()) {
|
// String next = it.next();
|
// visit(builder, next, ((JSONObject) obj).get(next));
|
// }
|
// builder.endObject();
|
// } else if (obj instanceof JSONArray) {
|
// builder.startArray(field);
|
// for (int i = 0; i < ((JSONArray) obj).length(); i++) {
|
// visit(builder, null, ((JSONArray) obj).get(i));
|
// }
|
// builder.endArray();
|
// } else {
|
// builder.field(field, obj);
|
// }
|
// }
|
// }
|
//}
|