ESList.groovy 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import com.yinjie.heating.common.api.ESDataInfoExecutor
  2. import com.yinjie.heating.common.api.QueryBuilderExecutor
  3. import com.yinjie.heating.common.api.SortBuilderExecutor
  4. import com.dySweetFishPlugin.elasticsearch.ESClient
  5. import com.sweetfish.convert.json.JsonConvert
  6. import com.sweetfish.source.PageFlipper
  7. import org.elasticsearch.action.search.SearchRequestBuilder
  8. import org.elasticsearch.action.search.SearchResponse
  9. import org.elasticsearch.common.unit.TimeValue
  10. import org.elasticsearch.index.query.QueryBuilder
  11. import org.elasticsearch.search.SearchHits
  12. /**
  13. * Created by jlutt on 2022-04-20
  14. *
  15. * @author jlutt
  16. */
  17. class ESList<T> {
  18. private ESClient esClient
  19. private JsonConvert jsonConvert
  20. private Class<T> clazz
  21. private QueryBuilderExecutor qbe
  22. private String index
  23. private ESDataInfoExecutor<T> de
  24. private List<SortBuilderExecutor> sbeList = new ArrayList<>()
  25. static <T> ESList<T> getESList() {
  26. return new ESList<>()
  27. }
  28. ESList<T> esClient(ESClient value) {
  29. this.esClient = value
  30. return this
  31. }
  32. ESList<T> jsonConvert(JsonConvert value) {
  33. this.jsonConvert = value
  34. return this
  35. }
  36. ESList<T> clazz(Class<T> value) {
  37. this.clazz = value
  38. return this
  39. }
  40. ESList<T> queryBuilder(QueryBuilderExecutor value) {
  41. this.qbe = value
  42. return this
  43. }
  44. ESList<T> sortBuilder(SortBuilderExecutor value) {
  45. this.sbeList.add(value)
  46. return this
  47. }
  48. ESList<T> index(String value) {
  49. this.index = value
  50. return this
  51. }
  52. ESList<T> dataExecutor(ESDataInfoExecutor<T> value) {
  53. this.de = value
  54. return this
  55. }
  56. List<T> executeNonePage() {
  57. QueryBuilder qb = qbe.execute(null)
  58. SearchRequestBuilder requestBuilder = esClient.getClient().prepareSearch(index).setQuery(qb)
  59. if ((sbeList != null) && (!sbeList.isEmpty())) {
  60. for (SortBuilderExecutor sortBuilderExecutor : sbeList) {
  61. if (sortBuilderExecutor != null) {
  62. requestBuilder = requestBuilder.addSort(sortBuilderExecutor.execute())
  63. }
  64. }
  65. }
  66. SearchResponse scrollResp = requestBuilder.setSize(100)
  67. .setScroll(new TimeValue(60000))
  68. .execute()
  69. .actionGet()
  70. List<T> resultList = new ArrayList<>()
  71. while (scrollResp.getHits().getHits().length != 0) {
  72. scrollResp.getHits().getHits().each { x ->
  73. String json = x.getSourceAsString()
  74. T result = jsonConvert.convertFrom(clazz, json)
  75. if (de != null) {
  76. de.execute(result)
  77. }
  78. resultList.add(result)
  79. }
  80. scrollResp = esClient.getClient().prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet()
  81. }
  82. return resultList
  83. }
  84. List<T> executePage(PageFlipper pageFlipper) {
  85. if (pageFlipper == null) {
  86. //加这个判断的目的是为了调用方统一代码,避免写了半天,调用方还要判断是否需要分页获取
  87. return executeNonePage()
  88. }
  89. //需要修改pageFlipper的值,所以pageFlipper作参数传入
  90. QueryBuilder qb = qbe.execute(null)
  91. SearchRequestBuilder requestBuilder = esClient.getClient().prepareSearch(index).setQuery(qb)
  92. if ((sbeList != null) && (!sbeList.isEmpty())) {
  93. for (SortBuilderExecutor sortBuilderExecutor : sbeList) {
  94. if (sortBuilderExecutor != null) {
  95. requestBuilder = requestBuilder.addSort(sortBuilderExecutor.execute())
  96. }
  97. }
  98. }
  99. requestBuilder = requestBuilder.setSize(pageFlipper.getPageSize())
  100. .setFrom(pageFlipper.getPageSize() * (pageFlipper.getPageIndex() - 1))
  101. SearchHits searchHits = requestBuilder.execute().actionGet().getHits()
  102. List<T> resultList = new ArrayList<>()
  103. searchHits.each { x ->
  104. String json = x.getSourceAsString()
  105. T result = jsonConvert.convertFrom(clazz, json)
  106. if (de != null) {
  107. de.execute(result)
  108. }
  109. resultList.add(result)
  110. }
  111. pageFlipper.setTotal(searchHits.getTotalHits())
  112. return resultList
  113. }
  114. }