//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 void insert(SO so) { // if (so != null) { // this.elasticsearchTemplate.index(buildIndexQuery(so)); // } // } // // @Override // public void insert(List soList) { // if (soList != null) { // List 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 对象类型 // * @return 索引处理对象 // */ // private IndexQuery buildIndexQuery(SO so) { // return new IndexQueryBuilder().withId(so.getId()).withObject(so).build(); // } // // @Override // public void update(SO so) { // if (so != null) { // this.elasticsearchTemplate.update(buildUpdateQuery(so)); // } // } // // @Override // public void update(List soList) { // if (soList != null) { // List list = new ArrayList<>(); // for (SO so : soList) { // if (so != null) { // list.add(buildUpdateQuery(so)); // } // } // this.elasticsearchTemplate.bulkUpdate(list); // } // } // // /** // * 创建更新对象 // * // * @param so 索引对象 // * @param BaseSearchObject 子类型 // * @return UpdateQuery // */ // private 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 void delete(SO so) { // if (so != null) { // this.elasticsearchTemplate.delete(so.getClass(), so.getId()); // } // } // // @Override // public void deleteAll(Class clazz) { // Assert.notNull(clazz, "clazz不能为空!"); // DeleteQuery deleteQuery = new DeleteQuery(); // deleteQuery.setQuery(QueryBuilders.matchAllQuery()); // this.elasticsearchTemplate.delete(deleteQuery, clazz); // this.elasticsearchTemplate.refresh(clazz); // } // // @Override // public void delete(List soList) { // if (soList != null) { // for (SO so : soList) { // this.delete(so); // } // } // } // // @Override // public T get(Class 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 List select(Class 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 List select(SplitPageInfo splitPageInfo, Class 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 List select(QueryBuilder queryBuilder, SearchParameter searchParameter, Class clazz) { // return this.select(queryBuilder, searchParameter, null, clazz); // } // // @Override // public List select(QueryBuilder queryBuilder, SearchParameter searchParameter, SplitPageInfo splitPageInfo, Class 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 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 BaseSearchObject 子类型 // * @return 分页结果 // */ // private Page queryForPage(SearchQuery query, SearchParameter searchParameter, Class 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 BaseSearchObject 子类型 // * @return 索引数量 // */ // private int count(SearchQuery searchQuery, Class clazz) { // return (int) this.elasticsearchTemplate.count(searchQuery, clazz); // } // // // @Override // public boolean deleteIndex(Class clazz) { // Assert.notNull(clazz, "clazz不能为空!"); // return this.elasticsearchTemplate.deleteIndex(clazz); // } // // @Override // public boolean createIndex(Class clazz) { // Assert.notNull(clazz, "clazz不能为空!"); // return this.elasticsearchTemplate.indexExists(clazz) || this.elasticsearchTemplate.createIndex(clazz); // } // // @Override // public boolean putMapping(Class 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 void refresh(Class clazz) { // Assert.notNull(clazz, "clazz不能为空!"); // this.elasticsearchTemplate.refresh(clazz); // } // // @Override // public Map aggs(AggregationBuilder abstractRangeBuilder, QueryBuilder queryBuilder, Class 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 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 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 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); // } // } // } //}