ElasticSearchUtil.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. package com.yihu.ehr.elasticsearch;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import com.yihu.ehr.elasticsearch.ElasticSearchPool;
  4. import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
  5. import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder;
  6. import org.elasticsearch.action.bulk.BulkRequestBuilder;
  7. import org.elasticsearch.action.get.GetRequest;
  8. import org.elasticsearch.action.get.GetResponse;
  9. import org.elasticsearch.action.index.IndexResponse;
  10. import org.elasticsearch.action.search.SearchRequestBuilder;
  11. import org.elasticsearch.action.search.SearchResponse;
  12. import org.elasticsearch.action.search.SearchType;
  13. import org.elasticsearch.client.transport.TransportClient;
  14. import org.elasticsearch.common.xcontent.XContentBuilder;
  15. import org.elasticsearch.common.xcontent.XContentFactory;
  16. import org.elasticsearch.index.engine.DocumentMissingException;
  17. import org.elasticsearch.index.query.*;
  18. import org.elasticsearch.search.SearchHit;
  19. import org.elasticsearch.search.SearchHits;
  20. import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
  21. import org.elasticsearch.search.aggregations.AggregationBuilders;
  22. import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramBuilder;
  23. import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
  24. import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
  25. import org.elasticsearch.search.aggregations.bucket.terms.Terms;
  26. import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
  27. import org.elasticsearch.search.aggregations.metrics.cardinality.CardinalityBuilder;
  28. import org.elasticsearch.search.aggregations.metrics.cardinality.InternalCardinality;
  29. import org.elasticsearch.search.aggregations.metrics.sum.Sum;
  30. import org.elasticsearch.search.aggregations.metrics.sum.SumBuilder;
  31. import org.elasticsearch.search.sort.FieldSortBuilder;
  32. import org.elasticsearch.search.sort.SortBuilder;
  33. import org.elasticsearch.search.sort.SortOrder;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.beans.factory.config.ConfigurableBeanFactory;
  36. import org.springframework.context.annotation.Scope;
  37. import org.springframework.data.domain.Page;
  38. import org.springframework.data.domain.PageImpl;
  39. import org.springframework.data.domain.PageRequest;
  40. import org.springframework.stereotype.Service;
  41. import org.springframework.util.StringUtils;
  42. import java.io.IOException;
  43. import java.sql.Connection;
  44. import java.sql.PreparedStatement;
  45. import java.sql.ResultSet;
  46. import java.text.ParseException;
  47. import java.util.*;
  48. /**
  49. * Util - Es搜索服务
  50. * Created by progr1mmer on 2017/12/2.
  51. */
  52. @Service
  53. @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
  54. public class ElasticSearchUtil {
  55. @Autowired
  56. private ElasticSearchPool elasticSearchPool;
  57. /**
  58. * 创建映射
  59. * 注意:保存数据之前如果没有创建相应的字
  60. * 段映射会导致搜索结果不准确
  61. * @param index
  62. * @param type
  63. * @param source
  64. * @param setting - 该设置根据需要进行配置
  65. * @throws IOException
  66. */
  67. public void mapping (String index, String type, Map<String, Map<String, String>> source, Map<String, Object> setting) throws IOException{
  68. TransportClient transportClient = elasticSearchPool.getClient();
  69. XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject().startObject("properties");
  70. for (String field : source.keySet()) {
  71. xContentBuilder.startObject(field);
  72. Map<String, String> propsMap = source.get(field);
  73. for (String prop : propsMap.keySet()) {
  74. xContentBuilder.field(prop, propsMap.get(prop));
  75. }
  76. xContentBuilder.endObject();
  77. }
  78. xContentBuilder.endObject().endObject();
  79. CreateIndexRequestBuilder createIndexRequestBuilder = transportClient.admin().indices().prepareCreate(index);
  80. createIndexRequestBuilder.addMapping(type, xContentBuilder);
  81. /*Map<String, Object> settingSource = new HashMap<>();
  82. settingSource.put("index.translog.flush_threshold_size", "1g"); //log文件大小
  83. settingSource.put("index.translog.flush_threshold_ops", "100000"); //flush触发次数
  84. settingSource.put("index.translog.durability", "async"); //异步更新
  85. settingSource.put("index.refresh_interval", "30s"); //刷新间隔
  86. settingSource.put("index.number_of_replicas", 1); //副本数
  87. settingSource.put("index.number_of_shards", 3); //分片数
  88. createIndexRequestBuilder.setSettings(settingSource);*/
  89. if (setting != null && !setting.isEmpty()) {
  90. createIndexRequestBuilder.setSettings(setting);
  91. }
  92. createIndexRequestBuilder.get();
  93. }
  94. /**
  95. * 移除索引 - 整个移除
  96. * @param index
  97. */
  98. public void remove (String index){
  99. TransportClient transportClient = elasticSearchPool.getClient();
  100. DeleteIndexRequestBuilder deleteIndexRequestBuilder = transportClient.admin().indices().prepareDelete(index);
  101. deleteIndexRequestBuilder.get();
  102. }
  103. /**
  104. * 添加数据
  105. * @param index
  106. * @param type
  107. * @param source
  108. * @return
  109. * @throws ParseException
  110. */
  111. public Map<String, Object> index (String index, String type, Map<String, Object> source) throws ParseException{
  112. TransportClient transportClient = elasticSearchPool.getClient();
  113. String _id = (String) source.remove("_id");
  114. if (StringUtils.isEmpty(_id)) {
  115. IndexResponse response = transportClient.prepareIndex(index, type).setSource(source).get();
  116. source.put("_id", response.getId());
  117. } else {
  118. IndexResponse response = transportClient.prepareIndex(index, type, _id).setSource(source).get();
  119. source.put("_id", response.getId());
  120. }
  121. return source;
  122. }
  123. /**
  124. * 批量添加数据 - 效率高
  125. * @param index
  126. * @param type
  127. * @param source
  128. * @throws ParseException
  129. */
  130. public void bulkIndex (String index, String type, List<Map<String, Object>> source) throws ParseException{
  131. if (source.size() > 0) {
  132. TransportClient transportClient = elasticSearchPool.getClient();
  133. BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();
  134. source.forEach(item -> {
  135. String _id = (String) item.remove("_id");
  136. if (StringUtils.isEmpty(_id)) {
  137. bulkRequestBuilder.add(transportClient.prepareIndex(index, type).setSource(item));
  138. } else {
  139. bulkRequestBuilder.add(transportClient.prepareIndex(index, type, _id).setSource(item));
  140. }
  141. });
  142. bulkRequestBuilder.get();
  143. }
  144. }
  145. /**
  146. * 删除数据
  147. * @param index
  148. * @param type
  149. * @param id
  150. */
  151. public void delete (String index, String type, String id) {
  152. TransportClient transportClient = elasticSearchPool.getClient();
  153. transportClient.prepareDelete(index, type, id).get();
  154. }
  155. /**
  156. * 批量删除数据
  157. * @param index
  158. * @param type
  159. * @param idArr
  160. */
  161. public void bulkDelete (String index, String type, String [] idArr) {
  162. if (idArr.length > 0) {
  163. TransportClient transportClient = elasticSearchPool.getClient();
  164. BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();
  165. for (String id : idArr) {
  166. bulkRequestBuilder.add(transportClient.prepareDelete(index, type, id));
  167. }
  168. bulkRequestBuilder.get();
  169. }
  170. }
  171. /**
  172. * 根据字段批量删除数据
  173. * @param index
  174. * @param type
  175. * @param field
  176. * @param value
  177. */
  178. public void deleteByField(String index, String type, String field, Object value) {
  179. deleteByFilter(index, type, field + "=" + value);
  180. }
  181. /**
  182. * 根据条件批量删除数据
  183. * @param index
  184. * @param type
  185. * @param filters
  186. */
  187. public void deleteByFilter(String index, String type, String filters) {
  188. QueryBuilder queryBuilder = getQueryBuilder(filters);
  189. deleteByFilter(index, type, queryBuilder);
  190. }
  191. /**
  192. * 根据条件批量删除数据
  193. * @param index
  194. * @param type
  195. * @param queryBuilder
  196. */
  197. public void deleteByFilter(String index, String type, QueryBuilder queryBuilder) {
  198. long count = count(index, type, queryBuilder);
  199. long page = count/10000 == 0 ? 1 :count/10000 +1;
  200. for (long i =0;i<page;i++) {
  201. List<String> idList = getIds(index, type, queryBuilder);
  202. if (idList.size() > 0) {
  203. TransportClient transportClient = elasticSearchPool.getClient();
  204. String[] idArr = new String[idList.size()];
  205. idArr = idList.toArray(idArr);
  206. BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();
  207. for (String id : idArr) {
  208. bulkRequestBuilder.add(transportClient.prepareDelete(index, type, id));
  209. }
  210. bulkRequestBuilder.get();
  211. }
  212. }
  213. }
  214. /**
  215. * 更新数据 - 返回最新文档
  216. * @param index
  217. * @param type
  218. * @param id
  219. * @param source
  220. * @return
  221. * @throws DocumentMissingException
  222. */
  223. public Map<String, Object> update(String index, String type, String id, Map<String, Object> source) throws DocumentMissingException {
  224. TransportClient transportClient = elasticSearchPool.getClient();
  225. source.remove("_id");
  226. transportClient.prepareUpdate(index, type, id).setDoc(source).setRetryOnConflict(5).get();
  227. return findById(index, type, id);
  228. }
  229. /**
  230. * 更新数据 - 不返回文档
  231. * @param index
  232. * @param type
  233. * @param id
  234. * @param source
  235. * @throws DocumentMissingException
  236. */
  237. public void voidUpdate (String index, String type, String id, Map<String, Object> source) throws DocumentMissingException {
  238. TransportClient transportClient = elasticSearchPool.getClient();
  239. source.remove("_id");
  240. transportClient.prepareUpdate(index, type, id).setDoc(source).setRetryOnConflict(5).get();
  241. }
  242. /**
  243. * 批量更新数据
  244. * @param index
  245. * @param type
  246. * @param source
  247. * @throws DocumentMissingException
  248. */
  249. public void bulkUpdate(String index, String type, List<Map<String, Object>> source) throws DocumentMissingException {
  250. if (source.size() > 0) {
  251. TransportClient transportClient = elasticSearchPool.getClient();
  252. BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();
  253. source.forEach(item -> {
  254. String _id = (String)item.remove("_id");
  255. if (!StringUtils.isEmpty(_id)) {
  256. bulkRequestBuilder.add(transportClient.prepareUpdate(index, type, _id).setDoc(item).setRetryOnConflict(5));
  257. }
  258. });
  259. bulkRequestBuilder.get();
  260. }
  261. }
  262. /**
  263. * 根据ID查找数据
  264. * @param index
  265. * @param type
  266. * @param id
  267. * @return
  268. */
  269. public Map<String, Object> findById(String index, String type, String id) {
  270. TransportClient transportClient = elasticSearchPool.getClient();
  271. GetRequest getRequest = new GetRequest(index, type, id);
  272. GetResponse response = transportClient.get(getRequest).actionGet();
  273. Map<String, Object> source = response.getSource();
  274. if (source != null) {
  275. source.put("_id", response.getId());
  276. }
  277. return source;
  278. }
  279. /**
  280. * 根据字段查找数据
  281. * @param index
  282. * @param type
  283. * @param field
  284. * @param value
  285. * @return
  286. */
  287. public List<Map<String, Object>> findByField(String index, String type, String field, Object value) {
  288. return list(index, type, field + "=" + value);
  289. }
  290. /**
  291. * 获取文档列表
  292. * @param index
  293. * @param type
  294. * @param filters
  295. * @return
  296. */
  297. public List<Map<String, Object>> list(String index, String type, String filters) {
  298. QueryBuilder queryBuilder = getQueryBuilder(filters);
  299. return list(index, type, queryBuilder);
  300. }
  301. /**
  302. * 获取文档列表
  303. * @param index
  304. * @param type
  305. * @param queryBuilder
  306. * @return
  307. */
  308. public List<Map<String, Object>> list(String index, String type, QueryBuilder queryBuilder) {
  309. int size = (int)count(index, type, queryBuilder);
  310. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, null, 0, size);
  311. SearchResponse response = builder.get();
  312. SearchHits hits = response.getHits();
  313. List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
  314. for (SearchHit hit : hits.getHits()) {
  315. Map<String, Object> source = hit.getSource();
  316. source.put("_id", hit.getId());
  317. resultList.add(source);
  318. }
  319. return resultList;
  320. }
  321. /**
  322. * 获取文档分页
  323. * @param index
  324. * @param type
  325. * @param filters
  326. * @param page
  327. * @param size
  328. * @return
  329. */
  330. public Page<Map<String, Object>> page(String index, String type, String filters, int page, int size) {
  331. return page(index, type, filters, null, page, size);
  332. }
  333. /**
  334. * 获取文档分页
  335. * @param index
  336. * @param type
  337. * @param filters
  338. * @param sorts
  339. * @param page
  340. * @param size
  341. * @return
  342. */
  343. public Page<Map<String, Object>> pageBySort(String index, String type, String filters, String sorts, int page, int size) {
  344. return page(index, type, filters, sorts, page, size);
  345. }
  346. /**
  347. * 获取分档分页 - 带分页功能
  348. * @param index
  349. * @param type
  350. * @param filters
  351. * @param sorts
  352. * @param page
  353. * @param size
  354. * @return
  355. */
  356. public Page<Map<String, Object>> page(String index, String type, String filters, String sorts, int page, int size) {
  357. QueryBuilder queryBuilder = getQueryBuilder(filters);
  358. List<SortBuilder> sortBuilders = getSortBuilder(sorts);
  359. return page(index, type, queryBuilder, sortBuilders, page, size);
  360. }
  361. /**
  362. * 获取分档分页 - 带分页功能
  363. * @param index
  364. * @param type
  365. * @param queryBuilder
  366. * @param sortBuilders
  367. * @param page
  368. * @param size
  369. * @return
  370. */
  371. public Page<Map<String, Object>> page(String index, String type, QueryBuilder queryBuilder, List<SortBuilder> sortBuilders, int page, int size) {
  372. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, sortBuilders, (page - 1) * size, size);
  373. SearchResponse response = builder.get();
  374. SearchHits hits = response.getHits();
  375. List<Map<String, Object>> resultList = new ArrayList<>();
  376. for (SearchHit hit : hits.getHits()) {
  377. Map<String, Object> source = hit.getSource();
  378. source.put("_id", hit.getId());
  379. resultList.add(source);
  380. }
  381. return new PageImpl<>(resultList, new PageRequest(page - 1, size), hits.totalHits());
  382. }
  383. /**
  384. * 获取ID列表
  385. * @param index
  386. * @param type
  387. * @param filters
  388. * @return
  389. */
  390. public List<String> getIds (String index, String type, String filters){
  391. QueryBuilder queryBuilder = getQueryBuilder(filters);
  392. return getIds(index, type, queryBuilder);
  393. }
  394. /**
  395. * 获取ID列表
  396. * @param index
  397. * @param type
  398. * @param queryBuilder
  399. * 最多只能一万条
  400. * @return
  401. */
  402. public List<String> getIds (String index, String type, QueryBuilder queryBuilder) {
  403. int size = (int)count(index, type, queryBuilder);
  404. size = size > 10000 ? 10000:size;
  405. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, null, 0, size);
  406. SearchResponse response = builder.get();
  407. SearchHits hits = response.getHits();
  408. List<String> resultList = new ArrayList<>();
  409. for (SearchHit hit : hits.getHits()) {
  410. resultList.add(hit.getId());
  411. }
  412. return resultList;
  413. }
  414. /**
  415. * 获取文档数
  416. * @param index
  417. * @param type
  418. * @param filters
  419. * @return
  420. */
  421. public long count(String index, String type, String filters) {
  422. QueryBuilder queryBuilder = getQueryBuilder(filters);
  423. return count(index, type, queryBuilder);
  424. }
  425. /**
  426. * 获取文档数
  427. * @param index
  428. * @param type
  429. * @param queryBuilder
  430. * @return
  431. */
  432. public long count(String index, String type, QueryBuilder queryBuilder) {
  433. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, null, null, null);
  434. return builder.get().getHits().totalHits();
  435. }
  436. /**
  437. * 根据SQL查找数据
  438. * @param field
  439. * @param sql
  440. * @return
  441. * @throws Exception
  442. */
  443. public List<Map<String, Object>> findBySql(List<String> field, String sql) throws Exception {
  444. List<Map<String, Object>> list = new ArrayList<>();
  445. DruidDataSource druidDataSource = null;
  446. Connection connection = null;
  447. PreparedStatement preparedStatement = null;
  448. ResultSet resultSet = null;
  449. try {
  450. druidDataSource = elasticSearchPool.getDruidDataSource();
  451. connection = druidDataSource.getConnection();
  452. preparedStatement = connection.prepareStatement(sql);
  453. resultSet = preparedStatement.executeQuery();
  454. while (resultSet.next()) {
  455. Map<String, Object> rowData = new HashMap<>();
  456. for (String _field : field) {
  457. rowData.put(_field, resultSet.getObject(_field));
  458. }
  459. list.add(rowData);
  460. }
  461. return list;
  462. } catch (Exception e) {
  463. if (!"Error".equals(e.getMessage())){
  464. e.printStackTrace();
  465. }
  466. return new ArrayList<>();
  467. } finally {
  468. if (resultSet != null) {
  469. resultSet.close();
  470. }
  471. if (preparedStatement != null) {
  472. preparedStatement.close();
  473. }
  474. if (connection != null) {
  475. connection.close();
  476. }
  477. if (druidDataSource != null) {
  478. druidDataSource.close();
  479. }
  480. }
  481. }
  482. /**
  483. * 根据SQL查找数据
  484. * @param sql
  485. * @return
  486. * @throws Exception
  487. */
  488. public ResultSet findBySql(String sql) throws Exception {
  489. DruidDataSource druidDataSource = null;
  490. Connection connection = null;
  491. PreparedStatement preparedStatement = null;
  492. ResultSet resultSet = null;
  493. try {
  494. druidDataSource = elasticSearchPool.getDruidDataSource();
  495. connection = druidDataSource.getConnection();
  496. preparedStatement = connection.prepareStatement(sql);
  497. resultSet = preparedStatement.executeQuery();
  498. return resultSet;
  499. } finally {
  500. if (resultSet != null) {
  501. resultSet.close();
  502. }
  503. if (preparedStatement != null) {
  504. preparedStatement.close();
  505. }
  506. if (connection != null) {
  507. connection.close();
  508. }
  509. if (druidDataSource != null) {
  510. druidDataSource.close();
  511. }
  512. }
  513. }
  514. /**
  515. * 根据日期分组
  516. * @param index
  517. * @param type
  518. * @param filters
  519. * @param start
  520. * @param end
  521. * @param field
  522. * @param interval
  523. * @param format
  524. * @return
  525. */
  526. public Map<String, Long> dateHistogram(String index, String type, String filters, Date start, Date end, String field, DateHistogramInterval interval, String format) {
  527. QueryBuilder queryBuilder = getQueryBuilder(filters);
  528. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, null, 0, 0);
  529. DateHistogramBuilder dateHistogramBuilder = new DateHistogramBuilder(index + "-" + field);
  530. dateHistogramBuilder.field(field);
  531. dateHistogramBuilder.interval(interval);
  532. if (!StringUtils.isEmpty(format)) {
  533. dateHistogramBuilder.format(format);
  534. }
  535. dateHistogramBuilder.minDocCount(0);
  536. dateHistogramBuilder.extendedBounds(start.getTime(), end.getTime());
  537. builder.addAggregation(dateHistogramBuilder);
  538. SearchResponse response = builder.get();
  539. Histogram histogram = response.getAggregations().get(index + "-" + field);
  540. Map<String, Long> temp = new HashMap<>();
  541. histogram.getBuckets().forEach(item -> temp.put(item.getKeyAsString(), item.getDocCount()));
  542. return temp;
  543. }
  544. /**
  545. * 查询去重数量
  546. * @param index
  547. * @param type
  548. * @param filters
  549. * @param filed
  550. * @return
  551. */
  552. public int cardinality(String index, String type, String filters, String filed){
  553. QueryBuilder queryBuilder = getQueryBuilder(filters);
  554. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, null, 0, 0);
  555. CardinalityBuilder cardinality = AggregationBuilders.cardinality("cardinality").field(filed);
  556. builder.addAggregation(cardinality);
  557. SearchResponse response = builder.get();
  558. InternalCardinality internalCard = response.getAggregations().get("cardinality");
  559. return new Double(internalCard.getProperty("value").toString()).intValue();
  560. }
  561. /**
  562. * 分组统计
  563. * @param index
  564. * @param type
  565. * @param filters
  566. * @param groupField
  567. * @return
  568. */
  569. public Map<String, Long> countByGroup(String index, String type, String filters, String groupField) {
  570. QueryBuilder queryBuilder = getQueryBuilder(filters);
  571. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, null, null, null);
  572. AbstractAggregationBuilder aggregation = AggregationBuilders.terms("count").field(groupField);
  573. builder.addAggregation(aggregation);
  574. SearchResponse response = builder.get();
  575. Terms terms = response.getAggregations().get("count");
  576. List<Terms.Bucket> buckets = terms.getBuckets();
  577. Map<String, Long> groupMap = new HashMap<>();
  578. for (Terms.Bucket bucket : buckets) {
  579. //System.out.println(bucket.getKey()+"----"+bucket.getDocCount());
  580. groupMap.put(bucket.getKey().toString(), bucket.getDocCount());
  581. }
  582. return groupMap;
  583. }
  584. /**
  585. * 分组求和
  586. * @param index
  587. * @param type
  588. * @param filters
  589. * @param sumField
  590. * @param groupField
  591. * @return
  592. */
  593. public Map<String, Double> sumByGroup(String index, String type, String filters, String sumField, String groupField) {
  594. QueryBuilder queryBuilder = getQueryBuilder(filters);
  595. SearchRequestBuilder builder = searchRequestBuilder(index, type, queryBuilder, null, null, null);
  596. TermsBuilder aggregation = AggregationBuilders.terms("sum_query").field(groupField);
  597. SumBuilder sumBuilder= AggregationBuilders.sum("sum_row").field(sumField);
  598. aggregation.subAggregation(sumBuilder);
  599. builder.addAggregation(aggregation);
  600. SearchResponse response = builder.get();
  601. Terms terms = response.getAggregations().get("sum_query");
  602. List<Terms.Bucket> buckets = terms.getBuckets();
  603. Map<String, Double> groupMap = new HashMap<>();
  604. for (Terms.Bucket bucket : buckets){
  605. Sum sum2 = bucket.getAggregations().get("sum_row");
  606. groupMap.put(bucket.getKey().toString(), sum2.getValue());
  607. }
  608. return groupMap;
  609. }
  610. /**
  611. * 获取基础请求生成器
  612. * @param index
  613. * @param type
  614. * @param queryBuilder
  615. * @param sortBuilders
  616. * @return
  617. */
  618. public SearchRequestBuilder searchRequestBuilder(String index, String type, QueryBuilder queryBuilder, List<SortBuilder> sortBuilders, Integer from, Integer size) {
  619. TransportClient transportClient = elasticSearchPool.getClient();
  620. SearchRequestBuilder builder = transportClient.prepareSearch(index);
  621. builder.setTypes(type);
  622. builder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
  623. builder.setQuery(queryBuilder);
  624. builder.setExplain(true);
  625. if (sortBuilders != null) {
  626. sortBuilders.forEach(item -> builder.addSort(item));
  627. }
  628. if (from != null) {
  629. builder.setFrom(from);
  630. }
  631. if (size != null) {
  632. builder.setSize(size);
  633. }
  634. return builder;
  635. }
  636. /**
  637. * 排序语句转换
  638. * @param sorts
  639. * @return
  640. */
  641. public List<SortBuilder> getSortBuilder(String sorts) {
  642. List<SortBuilder> sortBuilderList = new ArrayList<>();
  643. if (StringUtils.isEmpty(sorts)) {
  644. return sortBuilderList;
  645. }
  646. String [] sortArr = sorts.split(";");
  647. for (String sort : sortArr) {
  648. String operator = sort.substring(0, 1);
  649. SortBuilder sortBuilder = new FieldSortBuilder(sort.substring(1));
  650. if ("-".equalsIgnoreCase(operator.trim())) {
  651. sortBuilder.order(SortOrder.DESC);
  652. } else if ("+".equalsIgnoreCase(operator.trim())) {
  653. sortBuilder.order(SortOrder.ASC);
  654. } else {
  655. sortBuilder.order(SortOrder.DESC);
  656. }
  657. sortBuilderList.add(sortBuilder);
  658. }
  659. return sortBuilderList;
  660. }
  661. /**
  662. * 查询语句转换
  663. * @param filters
  664. * @return
  665. */
  666. public QueryBuilder getQueryBuilder(String filters) {
  667. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  668. if (StringUtils.isEmpty(filters)) {
  669. return boolQueryBuilder;
  670. }
  671. String [] filterArr = filters.split(";");
  672. for (String filter : filterArr) {
  673. if (filter.contains("||")){
  674. String [] fields = filter.split("\\|\\|");
  675. BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
  676. for (String filed : fields) {
  677. String [] condition = filed.split("=");
  678. if ("null".equals(condition[1])) {
  679. condition[1] ="";
  680. }
  681. queryBuilder.should(QueryBuilders.termQuery(condition[0], condition[1]));
  682. }
  683. boolQueryBuilder.must(queryBuilder);
  684. } else if (filter.contains("?")) {
  685. String [] condition = filter.split("\\?");
  686. if ("null".equals(condition[1])) {
  687. condition[1] ="";
  688. }
  689. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchPhraseQuery(condition[0], condition[1]);
  690. boolQueryBuilder.must(matchQueryBuilder);
  691. } else if (filter.contains("<>")) {
  692. String [] condition = filter.split("<>");
  693. if (condition[1].contains(",")) {
  694. String [] inCondition = condition[1].split(",");
  695. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery(condition[0], inCondition);
  696. boolQueryBuilder.mustNot(termsQueryBuilder);
  697. } else {
  698. if ("null".equals(condition[1])) {
  699. condition[1] ="";
  700. }
  701. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(condition[0], condition[1]);
  702. boolQueryBuilder.mustNot(termQueryBuilder);
  703. }
  704. } else if (filter.contains(">=")) {
  705. String [] condition = filter.split(">=");
  706. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(condition[0]);
  707. rangeQueryBuilder.gte(condition[1]);
  708. boolQueryBuilder.must(rangeQueryBuilder);
  709. } else if (filter.contains(">")) {
  710. String [] condition = filter.split(">");
  711. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(condition[0]);
  712. rangeQueryBuilder.gt(condition[1]);
  713. boolQueryBuilder.must(rangeQueryBuilder);
  714. } else if (filter.contains("<=")) {
  715. String [] condition = filter.split("<=");
  716. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(condition[0]);
  717. rangeQueryBuilder.lte(condition[1]);
  718. boolQueryBuilder.must(rangeQueryBuilder);
  719. } else if (filter.contains("<")) {
  720. String [] condition = filter.split("<");
  721. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(condition[0]);
  722. rangeQueryBuilder.lt(condition[1]);
  723. boolQueryBuilder.must(rangeQueryBuilder);
  724. } else if (filter.contains("=")) {
  725. String [] condition = filter.split("=");
  726. if (condition[1].contains(",")) {
  727. String [] inCondition = condition[1].split(",");
  728. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery(condition[0], inCondition);
  729. boolQueryBuilder.must(termsQueryBuilder);
  730. } else {
  731. if ("null".equals(condition[1])) {
  732. condition[1] = "";
  733. }
  734. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(condition[0], condition[1]);
  735. boolQueryBuilder.must(termQueryBuilder);
  736. }
  737. }
  738. }
  739. return boolQueryBuilder;
  740. }
  741. }