当前位置:   article > 正文

Java+springboot+elasticsearch7.6.2实现分组查询(平级+层级)并实现script多字段拼接查询以及大于小于等条件关系查询的实现_elasticsearch java 条件添加 数据小于等于

elasticsearch java 条件添加 数据小于等于

Java+springboot+elasticsearch7.6.2实现分组查询(平级+层级)并实现script多字段拼接查询

简介:关于elasticsearch的“层级”聚合,百度一下有一大堆文章。这里不再啰嗦了,由于百度了三个小时,也没找到我想要的"平级"查询的方法,最后还是自己研究源码整除来的,其实就是那么那么简单,只是没有例子,就不好整。上干货。

注:对es里的专业用语不熟,所以这里用的"平级","层级"两个测只是形象词语,不是es专业叫法。。。知道叫法的请留言告知。

 

目录

Java+springboot+elasticsearch7.6.2实现分组查询(平级+层级)并实现script多字段拼接查询

第一步、 实现平级搜索。

第二部、实现平级+层级分组聚合

第三部、script实现多字段查询

四、分词的字段做聚合

五、实践代码


 

第一步、 实现平级搜索。

先看一下,测试数据的数据结构:

kibana:

  1. GET ermsftrv1/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

结果:

  1. {
  2. "took" : 0,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 6,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "ermsftrv1",
  19. "_type" : "_doc",
  20. "_id" : "6502586031240448",
  21. "_score" : 1.0,
  22. "_source" : {
  23. "annual" : "",
  24. "archName" : "新建文本文档",
  25. "archNo" : "0022-SB0000.TODO-TODO-001",
  26. "archTypeCode" : "SB0000",
  27. "archTypeId" : "6485930821313792",
  28. "archTypeName" : "设备仪器",
  29. "archivedDate" : 1587545484000,
  30. "archivedDep" : "1753-11-11 00:00:00",
  31. "archivedOperator" : "",
  32. "documentPage" : 0,
  33. "entityTypeId" : 1,
  34. "expDate" : -6820704000000,
  35. "fileNo" : "",
  36. "handlerId" : 6502586302145792,
  37. "id" : "6502586031240448",
  38. "pageNum" : "0",
  39. "picPage" : 0,
  40. "responsibleDept" : "",
  41. "responsibleOper" : "hanfeixian",
  42. "savePeriod" : "永久",
  43. "savePeriodId" : "1",
  44. "secret" : "普通商密",
  45. "secretExpDate" : 1650556800000,
  46. "secretId" : "2",
  47. "secretPeriodId" : 1,
  48. "sectId" : "6480640146142464",
  49. "sectName" : "新奥集团档案局",
  50. "sectNo" : "A0022",
  51. "thridId" : "A0022-2020-0000000722",
  52. "writingDate" : 1650556800000,
  53. "year" : "2020"
  54. }
  55. },
  56. {
  57. "_index" : "ermsftrv1",
  58. "_type" : "_doc",
  59. "_id" : "6500384144856320",
  60. "_score" : 1.0,
  61. "_source" : {
  62. "annual" : "",
  63. "archName" : "问题",
  64. "archNo" : "0022-JS0000-TODO.-TODO-027",
  65. "archTypeCode" : "JS0000",
  66. "archTypeId" : "6485924961527040",
  67. "archTypeName" : "建设项目",
  68. "archivedDate" : 1587548214000,
  69. "archivedDep" : "1753-11-11 00:00:00",
  70. "archivedOperator" : "",
  71. "documentPage" : 0,
  72. "entityTypeId" : 1,
  73. "expDate" : -6820704000000,
  74. "fileNo" : "",
  75. "handlerId" : 6502597485647104,
  76. "id" : "6500384144856320",
  77. "pageNum" : "1",
  78. "picPage" : 0,
  79. "responsibleDept" : "",
  80. "responsibleOper" : "hanfeixian",
  81. "savePeriod" : "永久",
  82. "savePeriodId" : "1",
  83. "secret" : "普通商密",
  84. "secretExpDate" : 1650038400000,
  85. "secretId" : "2",
  86. "secretPeriodId" : 9,
  87. "sectId" : "6480640146142464",
  88. "sectName" : "新奥集团档案局",
  89. "sectNo" : "A0022",
  90. "thridId" : "A0022-2020-0000000723",
  91. "writingDate" : 1650038400000,
  92. "year" : "2020"
  93. }
  94. },
  95. {
  96. "_index" : "ermsftrv1",
  97. "_type" : "_doc",
  98. "_id" : "6503214760639744",
  99. "_score" : 1.0,
  100. "_source" : {
  101. "annual" : "2020",
  102. "archName" : "曹操出行-2行程单",
  103. "archNo" : "0022-ZZ0100.TODO-03-006",
  104. "archTypeCode" : "ZZ0100",
  105. "archTypeId" : "6489894262050048",
  106. "archTypeName" : "01 企业证照",
  107. "archivedDate" : 1587699428000,
  108. "archivedDep" : "1753-11-11 00:00:00",
  109. "archivedOperator" : "",
  110. "documentPage" : 0,
  111. "entityTypeId" : 1,
  112. "expDate" : -6820704000000,
  113. "fileNo" : "",
  114. "handlerId" : 6503216857251072,
  115. "id" : "6503214760639744",
  116. "pageNum" : "0",
  117. "picPage" : 0,
  118. "responsibleDept" : "",
  119. "responsibleOper" : "zhangjunk",
  120. "savePeriod" : "30年",
  121. "savePeriodId" : "3",
  122. "secret" : "核心商密",
  123. "secretExpDate" : 1638633600000,
  124. "secretId" : "3",
  125. "secretPeriodId" : 1,
  126. "sectId" : "6480626827621632",
  127. "sectName" : "新奥集团股份有限公司",
  128. "sectNo" : "A0022",
  129. "thridId" : "A0022-2020-0000000187",
  130. "writingDate" : 1638633600000,
  131. "year" : "2020"
  132. }
  133. },
  134. {
  135. "_index" : "ermsftrv1",
  136. "_type" : "_doc",
  137. "_id" : "6503218290695424",
  138. "_score" : 1.0,
  139. "_source" : {
  140. "annual" : "",
  141. "archName" : "消息接入规范",
  142. "archNo" : "0022-ZZ0200.TODO-K093-002",
  143. "archTypeCode" : "ZZ0200",
  144. "archTypeId" : "6495573858862336",
  145. "archTypeName" : "02 领导证照",
  146. "archivedDate" : 1587709784000,
  147. "archivedDep" : "1753-11-11 00:00:00",
  148. "archivedOperator" : "",
  149. "documentPage" : 0,
  150. "entityTypeId" : 2,
  151. "expDate" : 1619258366000,
  152. "fileNo" : "",
  153. "handlerId" : 6503218290752768,
  154. "id" : "6503218290695424",
  155. "pageNum" : "0",
  156. "picPage" : 0,
  157. "responsibleDept" : "",
  158. "responsibleOper" : "zhangjunk",
  159. "savePeriod" : "永久",
  160. "savePeriodId" : "1",
  161. "secret" : "核心商密",
  162. "secretExpDate" : 1808560781000,
  163. "secretId" : "3",
  164. "secretPeriodId" : 7,
  165. "sectId" : "6480626827621632",
  166. "sectName" : "新奥集团股份有限公司",
  167. "sectNo" : "A0022",
  168. "thridId" : "A0022-2020-0000000318",
  169. "writingDate" : 1584547200000,
  170. "year" : "2020"
  171. }
  172. },
  173. {
  174. "_index" : "ermsftrv1",
  175. "_type" : "_doc",
  176. "_id" : "6503265140862208",
  177. "_score" : 1.0,
  178. "_source" : {
  179. "annual" : "",
  180. "archName" : "新奥档案系统-项目进度计划-20200408",
  181. "archNo" : "0022-ZZ0200.TODO-null-010",
  182. "archTypeCode" : "ZZ0200",
  183. "archTypeId" : "6495573858862336",
  184. "archTypeName" : "02 领导证照",
  185. "archivedDate" : 1587711282000,
  186. "archivedDep" : "1753-11-11 00:00:00",
  187. "archivedOperator" : "",
  188. "documentPage" : 0,
  189. "entityTypeId" : 1,
  190. "expDate" : -6820704000000,
  191. "fileNo" : "",
  192. "handlerId" : 6503265140927744,
  193. "id" : "6503265140862208",
  194. "pageNum" : "0",
  195. "picPage" : 0,
  196. "responsibleDept" : "",
  197. "responsibleOper" : "zhangjunk",
  198. "savePeriod" : "永久",
  199. "savePeriodId" : "1",
  200. "secret" : "核心商密",
  201. "secretExpDate" : 1649347200000,
  202. "secretId" : "3",
  203. "secretPeriodId" : 1,
  204. "sectId" : "6480640146142464",
  205. "sectName" : "新奥集团档案局",
  206. "sectNo" : "A0022",
  207. "thridId" : "A0022-2020-0000000768",
  208. "writingDate" : 1649347200000,
  209. "year" : "2020"
  210. }
  211. },
  212. {
  213. "_index" : "ermsftrv1",
  214. "_type" : "_doc",
  215. "_id" : "6503265140526336",
  216. "_score" : 1.0,
  217. "_source" : {
  218. "annual" : "",
  219. "archName" : "新奥档案系统-项目进度计划-20200415",
  220. "archNo" : "0022-ZZ0200.TODO-null-011",
  221. "archTypeCode" : "ZZ0200",
  222. "archTypeId" : "6495573858862336",
  223. "archTypeName" : "02 领导证照",
  224. "archivedDate" : 1587711282000,
  225. "archivedDep" : "1753-11-11 00:00:00",
  226. "archivedOperator" : "",
  227. "documentPage" : 0,
  228. "entityTypeId" : 1,
  229. "expDate" : -6820704000000,
  230. "fileNo" : "",
  231. "handlerId" : 6503265411443968,
  232. "id" : "6503265140526336",
  233. "pageNum" : "0",
  234. "picPage" : 0,
  235. "responsibleDept" : "",
  236. "responsibleOper" : "zhangjunk",
  237. "savePeriod" : "永久",
  238. "savePeriodId" : "1",
  239. "secret" : "普通商密",
  240. "secretExpDate" : 1650384000000,
  241. "secretId" : "2",
  242. "secretPeriodId" : 1,
  243. "sectId" : "6480640146142464",
  244. "sectName" : "新奥集团档案局",
  245. "sectNo" : "A0022",
  246. "thridId" : "A0022-2020-0000000769",
  247. "writingDate" : 1650384000000,
  248. "year" : "2020"
  249. }
  250. }
  251. ]
  252. }
  253. }

实现archTypeId和year做聚合实现平级分组。

kibana:

  1. POST ermsftrv1/_search
  2. {
  3. "aggs": {
  4. "archTypeGroup": {
  5. "terms": {
  6. "field": "archTypeId.keyword",
  7. "size": 10
  8. }
  9. },
  10. "yearGroup": {
  11. "terms": {
  12. "field": "year.keyword",
  13. "size": 10
  14. }
  15. }
  16. }
  17. }

结果:

  1. {
  2. "took" : 1,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 6,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "ermsftrv1",
  19. "_type" : "_doc",
  20. "_id" : "6502586031240448",
  21. "_score" : 1.0,
  22. "_source" : {
  23. "annual" : "",
  24. "archName" : "新建文本文档",
  25. "archNo" : "0022-SB0000.TODO-TODO-001",
  26. "archTypeCode" : "SB0000",
  27. "archTypeId" : "6485930821313792",
  28. "archTypeName" : "设备仪器",
  29. "archivedDate" : 1587545484000,
  30. "archivedDep" : "1753-11-11 00:00:00",
  31. "archivedOperator" : "",
  32. "documentPage" : 0,
  33. "entityTypeId" : 1,
  34. "expDate" : -6820704000000,
  35. "fileNo" : "",
  36. "handlerId" : 6502586302145792,
  37. "id" : "6502586031240448",
  38. "pageNum" : "0",
  39. "picPage" : 0,
  40. "responsibleDept" : "",
  41. "responsibleOper" : "hanfeixian",
  42. "savePeriod" : "永久",
  43. "savePeriodId" : "1",
  44. "secret" : "普通商密",
  45. "secretExpDate" : 1650556800000,
  46. "secretId" : "2",
  47. "secretPeriodId" : 1,
  48. "sectId" : "6480640146142464",
  49. "sectName" : "新奥集团档案局",
  50. "sectNo" : "A0022",
  51. "thridId" : "A0022-2020-0000000722",
  52. "writingDate" : 1650556800000,
  53. "year" : "2020"
  54. }
  55. },
  56. {
  57. "_index" : "ermsftrv1",
  58. "_type" : "_doc",
  59. "_id" : "6500384144856320",
  60. "_score" : 1.0,
  61. "_source" : {
  62. "annual" : "",
  63. "archName" : "问题",
  64. "archNo" : "0022-JS0000-TODO.-TODO-027",
  65. "archTypeCode" : "JS0000",
  66. "archTypeId" : "6485924961527040",
  67. "archTypeName" : "建设项目",
  68. "archivedDate" : 1587548214000,
  69. "archivedDep" : "1753-11-11 00:00:00",
  70. "archivedOperator" : "",
  71. "documentPage" : 0,
  72. "entityTypeId" : 1,
  73. "expDate" : -6820704000000,
  74. "fileNo" : "",
  75. "handlerId" : 6502597485647104,
  76. "id" : "6500384144856320",
  77. "pageNum" : "1",
  78. "picPage" : 0,
  79. "responsibleDept" : "",
  80. "responsibleOper" : "hanfeixian",
  81. "savePeriod" : "永久",
  82. "savePeriodId" : "1",
  83. "secret" : "普通商密",
  84. "secretExpDate" : 1650038400000,
  85. "secretId" : "2",
  86. "secretPeriodId" : 9,
  87. "sectId" : "6480640146142464",
  88. "sectName" : "新奥集团档案局",
  89. "sectNo" : "A0022",
  90. "thridId" : "A0022-2020-0000000723",
  91. "writingDate" : 1650038400000,
  92. "year" : "2020"
  93. }
  94. },
  95. {
  96. "_index" : "ermsftrv1",
  97. "_type" : "_doc",
  98. "_id" : "6503214760639744",
  99. "_score" : 1.0,
  100. "_source" : {
  101. "annual" : "2020",
  102. "archName" : "曹操出行-2行程单",
  103. "archNo" : "0022-ZZ0100.TODO-03-006",
  104. "archTypeCode" : "ZZ0100",
  105. "archTypeId" : "6489894262050048",
  106. "archTypeName" : "01 企业证照",
  107. "archivedDate" : 1587699428000,
  108. "archivedDep" : "1753-11-11 00:00:00",
  109. "archivedOperator" : "",
  110. "documentPage" : 0,
  111. "entityTypeId" : 1,
  112. "expDate" : -6820704000000,
  113. "fileNo" : "",
  114. "handlerId" : 6503216857251072,
  115. "id" : "6503214760639744",
  116. "pageNum" : "0",
  117. "picPage" : 0,
  118. "responsibleDept" : "",
  119. "responsibleOper" : "zhangjunk",
  120. "savePeriod" : "30年",
  121. "savePeriodId" : "3",
  122. "secret" : "核心商密",
  123. "secretExpDate" : 1638633600000,
  124. "secretId" : "3",
  125. "secretPeriodId" : 1,
  126. "sectId" : "6480626827621632",
  127. "sectName" : "新奥集团股份有限公司",
  128. "sectNo" : "A0022",
  129. "thridId" : "A0022-2020-0000000187",
  130. "writingDate" : 1638633600000,
  131. "year" : "2020"
  132. }
  133. },
  134. {
  135. "_index" : "ermsftrv1",
  136. "_type" : "_doc",
  137. "_id" : "6503218290695424",
  138. "_score" : 1.0,
  139. "_source" : {
  140. "annual" : "",
  141. "archName" : "消息接入规范",
  142. "archNo" : "0022-ZZ0200.TODO-K093-002",
  143. "archTypeCode" : "ZZ0200",
  144. "archTypeId" : "6495573858862336",
  145. "archTypeName" : "02 领导证照",
  146. "archivedDate" : 1587709784000,
  147. "archivedDep" : "1753-11-11 00:00:00",
  148. "archivedOperator" : "",
  149. "documentPage" : 0,
  150. "entityTypeId" : 2,
  151. "expDate" : 1619258366000,
  152. "fileNo" : "",
  153. "handlerId" : 6503218290752768,
  154. "id" : "6503218290695424",
  155. "pageNum" : "0",
  156. "picPage" : 0,
  157. "responsibleDept" : "",
  158. "responsibleOper" : "zhangjunk",
  159. "savePeriod" : "永久",
  160. "savePeriodId" : "1",
  161. "secret" : "核心商密",
  162. "secretExpDate" : 1808560781000,
  163. "secretId" : "3",
  164. "secretPeriodId" : 7,
  165. "sectId" : "6480626827621632",
  166. "sectName" : "新奥集团股份有限公司",
  167. "sectNo" : "A0022",
  168. "thridId" : "A0022-2020-0000000318",
  169. "writingDate" : 1584547200000,
  170. "year" : "2020"
  171. }
  172. },
  173. {
  174. "_index" : "ermsftrv1",
  175. "_type" : "_doc",
  176. "_id" : "6503265140862208",
  177. "_score" : 1.0,
  178. "_source" : {
  179. "annual" : "",
  180. "archName" : "新奥档案系统-项目进度计划-20200408",
  181. "archNo" : "0022-ZZ0200.TODO-null-010",
  182. "archTypeCode" : "ZZ0200",
  183. "archTypeId" : "6495573858862336",
  184. "archTypeName" : "02 领导证照",
  185. "archivedDate" : 1587711282000,
  186. "archivedDep" : "1753-11-11 00:00:00",
  187. "archivedOperator" : "",
  188. "documentPage" : 0,
  189. "entityTypeId" : 1,
  190. "expDate" : -6820704000000,
  191. "fileNo" : "",
  192. "handlerId" : 6503265140927744,
  193. "id" : "6503265140862208",
  194. "pageNum" : "0",
  195. "picPage" : 0,
  196. "responsibleDept" : "",
  197. "responsibleOper" : "zhangjunk",
  198. "savePeriod" : "永久",
  199. "savePeriodId" : "1",
  200. "secret" : "核心商密",
  201. "secretExpDate" : 1649347200000,
  202. "secretId" : "3",
  203. "secretPeriodId" : 1,
  204. "sectId" : "6480640146142464",
  205. "sectName" : "新奥集团档案局",
  206. "sectNo" : "A0022",
  207. "thridId" : "A0022-2020-0000000768",
  208. "writingDate" : 1649347200000,
  209. "year" : "2020"
  210. }
  211. },
  212. {
  213. "_index" : "ermsftrv1",
  214. "_type" : "_doc",
  215. "_id" : "6503265140526336",
  216. "_score" : 1.0,
  217. "_source" : {
  218. "annual" : "",
  219. "archName" : "新奥档案系统-项目进度计划-20200415",
  220. "archNo" : "0022-ZZ0200.TODO-null-011",
  221. "archTypeCode" : "ZZ0200",
  222. "archTypeId" : "6495573858862336",
  223. "archTypeName" : "02 领导证照",
  224. "archivedDate" : 1587711282000,
  225. "archivedDep" : "1753-11-11 00:00:00",
  226. "archivedOperator" : "",
  227. "documentPage" : 0,
  228. "entityTypeId" : 1,
  229. "expDate" : -6820704000000,
  230. "fileNo" : "",
  231. "handlerId" : 6503265411443968,
  232. "id" : "6503265140526336",
  233. "pageNum" : "0",
  234. "picPage" : 0,
  235. "responsibleDept" : "",
  236. "responsibleOper" : "zhangjunk",
  237. "savePeriod" : "永久",
  238. "savePeriodId" : "1",
  239. "secret" : "普通商密",
  240. "secretExpDate" : 1650384000000,
  241. "secretId" : "2",
  242. "secretPeriodId" : 1,
  243. "sectId" : "6480640146142464",
  244. "sectName" : "新奥集团档案局",
  245. "sectNo" : "A0022",
  246. "thridId" : "A0022-2020-0000000769",
  247. "writingDate" : 1650384000000,
  248. "year" : "2020"
  249. }
  250. }
  251. ]
  252. },
  253. "aggregations" : {
  254. "yearGroup" : {
  255. "doc_count_error_upper_bound" : 0,
  256. "sum_other_doc_count" : 0,
  257. "buckets" : [
  258. {
  259. "key" : "2020",
  260. "doc_count" : 6
  261. }
  262. ]
  263. },
  264. "archTypeGroup" : {
  265. "doc_count_error_upper_bound" : 0,
  266. "sum_other_doc_count" : 0,
  267. "buckets" : [
  268. {
  269. "key" : "6495573858862336",
  270. "doc_count" : 3
  271. },
  272. {
  273. "key" : "6485924961527040",
  274. "doc_count" : 1
  275. },
  276. {
  277. "key" : "6485930821313792",
  278. "doc_count" : 1
  279. },
  280. {
  281. "key" : "6489894262050048",
  282. "doc_count" : 1
  283. }
  284. ]
  285. }
  286. }
  287. }

java springboot实现:

  1. SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
  2. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  3. //第一个字段进行分组
  4. TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("yearGroup").field("year.keyword");
  5. //根据第二个字段进行分组
  6. TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("archTypeGroup").field("archTypeId.keyword");
  7. //如果存在第三个,以此类推...
  8. //只需要平级添加聚合条件即可
  9. sourceBuilder.aggregation(yearGroupAgg);
  10. sourceBuilder.aggregation(archTypeGroupAgg);
  11. searchRequest.source(sourceBuilder);

第二部、实现平级+层级分组聚合

实现archTypeId和year做聚合实现平级分组,同时实现archTypeId和secret层级聚合分组(也是百度中大篇幅的层级聚合分组)。

kibana:

  1. POST ermsftrv1/_search
  2. {
  3. "aggs": {
  4. "archTypeGroup": {
  5. "terms": {
  6. "field": "archTypeId.keyword",
  7. "size": 10
  8. },
  9. "aggs": {
  10. "secretGroup": {
  11. "terms": {
  12. "field": "secret.keyword"
  13. }
  14. }
  15. }
  16. },
  17. "yearGroup": {
  18. "terms": {
  19. "field": "year.keyword",
  20. "size": 10
  21. }
  22. }
  23. }
  24. }

结果:

  1. {
  2. "took" : 2,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 6,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "ermsftrv1",
  19. "_type" : "_doc",
  20. "_id" : "6502586031240448",
  21. "_score" : 1.0,
  22. "_source" : {
  23. "annual" : "",
  24. "archName" : "新建文本文档",
  25. "archNo" : "0022-SB0000.TODO-TODO-001",
  26. "archTypeCode" : "SB0000",
  27. "archTypeId" : "6485930821313792",
  28. "archTypeName" : "设备仪器",
  29. "archivedDate" : 1587545484000,
  30. "archivedDep" : "1753-11-11 00:00:00",
  31. "archivedOperator" : "",
  32. "documentPage" : 0,
  33. "entityTypeId" : 1,
  34. "expDate" : -6820704000000,
  35. "fileNo" : "",
  36. "handlerId" : 6502586302145792,
  37. "id" : "6502586031240448",
  38. "pageNum" : "0",
  39. "picPage" : 0,
  40. "responsibleDept" : "",
  41. "responsibleOper" : "hanfeixian",
  42. "savePeriod" : "永久",
  43. "savePeriodId" : "1",
  44. "secret" : "普通商密",
  45. "secretExpDate" : 1650556800000,
  46. "secretId" : "2",
  47. "secretPeriodId" : 1,
  48. "sectId" : "6480640146142464",
  49. "sectName" : "新奥集团档案局",
  50. "sectNo" : "A0022",
  51. "thridId" : "A0022-2020-0000000722",
  52. "writingDate" : 1650556800000,
  53. "year" : "2020"
  54. }
  55. },
  56. {
  57. "_index" : "ermsftrv1",
  58. "_type" : "_doc",
  59. "_id" : "6500384144856320",
  60. "_score" : 1.0,
  61. "_source" : {
  62. "annual" : "",
  63. "archName" : "问题",
  64. "archNo" : "0022-JS0000-TODO.-TODO-027",
  65. "archTypeCode" : "JS0000",
  66. "archTypeId" : "6485924961527040",
  67. "archTypeName" : "建设项目",
  68. "archivedDate" : 1587548214000,
  69. "archivedDep" : "1753-11-11 00:00:00",
  70. "archivedOperator" : "",
  71. "documentPage" : 0,
  72. "entityTypeId" : 1,
  73. "expDate" : -6820704000000,
  74. "fileNo" : "",
  75. "handlerId" : 6502597485647104,
  76. "id" : "6500384144856320",
  77. "pageNum" : "1",
  78. "picPage" : 0,
  79. "responsibleDept" : "",
  80. "responsibleOper" : "hanfeixian",
  81. "savePeriod" : "永久",
  82. "savePeriodId" : "1",
  83. "secret" : "普通商密",
  84. "secretExpDate" : 1650038400000,
  85. "secretId" : "2",
  86. "secretPeriodId" : 9,
  87. "sectId" : "6480640146142464",
  88. "sectName" : "新奥集团档案局",
  89. "sectNo" : "A0022",
  90. "thridId" : "A0022-2020-0000000723",
  91. "writingDate" : 1650038400000,
  92. "year" : "2020"
  93. }
  94. },
  95. {
  96. "_index" : "ermsftrv1",
  97. "_type" : "_doc",
  98. "_id" : "6503214760639744",
  99. "_score" : 1.0,
  100. "_source" : {
  101. "annual" : "2020",
  102. "archName" : "曹操出行-2行程单",
  103. "archNo" : "0022-ZZ0100.TODO-03-006",
  104. "archTypeCode" : "ZZ0100",
  105. "archTypeId" : "6489894262050048",
  106. "archTypeName" : "01 企业证照",
  107. "archivedDate" : 1587699428000,
  108. "archivedDep" : "1753-11-11 00:00:00",
  109. "archivedOperator" : "",
  110. "documentPage" : 0,
  111. "entityTypeId" : 1,
  112. "expDate" : -6820704000000,
  113. "fileNo" : "",
  114. "handlerId" : 6503216857251072,
  115. "id" : "6503214760639744",
  116. "pageNum" : "0",
  117. "picPage" : 0,
  118. "responsibleDept" : "",
  119. "responsibleOper" : "zhangjunk",
  120. "savePeriod" : "30年",
  121. "savePeriodId" : "3",
  122. "secret" : "核心商密",
  123. "secretExpDate" : 1638633600000,
  124. "secretId" : "3",
  125. "secretPeriodId" : 1,
  126. "sectId" : "6480626827621632",
  127. "sectName" : "新奥集团股份有限公司",
  128. "sectNo" : "A0022",
  129. "thridId" : "A0022-2020-0000000187",
  130. "writingDate" : 1638633600000,
  131. "year" : "2020"
  132. }
  133. },
  134. {
  135. "_index" : "ermsftrv1",
  136. "_type" : "_doc",
  137. "_id" : "6503218290695424",
  138. "_score" : 1.0,
  139. "_source" : {
  140. "annual" : "",
  141. "archName" : "消息接入规范",
  142. "archNo" : "0022-ZZ0200.TODO-K093-002",
  143. "archTypeCode" : "ZZ0200",
  144. "archTypeId" : "6495573858862336",
  145. "archTypeName" : "02 领导证照",
  146. "archivedDate" : 1587709784000,
  147. "archivedDep" : "1753-11-11 00:00:00",
  148. "archivedOperator" : "",
  149. "documentPage" : 0,
  150. "entityTypeId" : 2,
  151. "expDate" : 1619258366000,
  152. "fileNo" : "",
  153. "handlerId" : 6503218290752768,
  154. "id" : "6503218290695424",
  155. "pageNum" : "0",
  156. "picPage" : 0,
  157. "responsibleDept" : "",
  158. "responsibleOper" : "zhangjunk",
  159. "savePeriod" : "永久",
  160. "savePeriodId" : "1",
  161. "secret" : "核心商密",
  162. "secretExpDate" : 1808560781000,
  163. "secretId" : "3",
  164. "secretPeriodId" : 7,
  165. "sectId" : "6480626827621632",
  166. "sectName" : "新奥集团股份有限公司",
  167. "sectNo" : "A0022",
  168. "thridId" : "A0022-2020-0000000318",
  169. "writingDate" : 1584547200000,
  170. "year" : "2020"
  171. }
  172. },
  173. {
  174. "_index" : "ermsftrv1",
  175. "_type" : "_doc",
  176. "_id" : "6503265140862208",
  177. "_score" : 1.0,
  178. "_source" : {
  179. "annual" : "",
  180. "archName" : "新奥档案系统-项目进度计划-20200408",
  181. "archNo" : "0022-ZZ0200.TODO-null-010",
  182. "archTypeCode" : "ZZ0200",
  183. "archTypeId" : "6495573858862336",
  184. "archTypeName" : "02 领导证照",
  185. "archivedDate" : 1587711282000,
  186. "archivedDep" : "1753-11-11 00:00:00",
  187. "archivedOperator" : "",
  188. "documentPage" : 0,
  189. "entityTypeId" : 1,
  190. "expDate" : -6820704000000,
  191. "fileNo" : "",
  192. "handlerId" : 6503265140927744,
  193. "id" : "6503265140862208",
  194. "pageNum" : "0",
  195. "picPage" : 0,
  196. "responsibleDept" : "",
  197. "responsibleOper" : "zhangjunk",
  198. "savePeriod" : "永久",
  199. "savePeriodId" : "1",
  200. "secret" : "核心商密",
  201. "secretExpDate" : 1649347200000,
  202. "secretId" : "3",
  203. "secretPeriodId" : 1,
  204. "sectId" : "6480640146142464",
  205. "sectName" : "新奥集团档案局",
  206. "sectNo" : "A0022",
  207. "thridId" : "A0022-2020-0000000768",
  208. "writingDate" : 1649347200000,
  209. "year" : "2020"
  210. }
  211. },
  212. {
  213. "_index" : "ermsftrv1",
  214. "_type" : "_doc",
  215. "_id" : "6503265140526336",
  216. "_score" : 1.0,
  217. "_source" : {
  218. "annual" : "",
  219. "archName" : "新奥档案系统-项目进度计划-20200415",
  220. "archNo" : "0022-ZZ0200.TODO-null-011",
  221. "archTypeCode" : "ZZ0200",
  222. "archTypeId" : "6495573858862336",
  223. "archTypeName" : "02 领导证照",
  224. "archivedDate" : 1587711282000,
  225. "archivedDep" : "1753-11-11 00:00:00",
  226. "archivedOperator" : "",
  227. "documentPage" : 0,
  228. "entityTypeId" : 1,
  229. "expDate" : -6820704000000,
  230. "fileNo" : "",
  231. "handlerId" : 6503265411443968,
  232. "id" : "6503265140526336",
  233. "pageNum" : "0",
  234. "picPage" : 0,
  235. "responsibleDept" : "",
  236. "responsibleOper" : "zhangjunk",
  237. "savePeriod" : "永久",
  238. "savePeriodId" : "1",
  239. "secret" : "普通商密",
  240. "secretExpDate" : 1650384000000,
  241. "secretId" : "2",
  242. "secretPeriodId" : 1,
  243. "sectId" : "6480640146142464",
  244. "sectName" : "新奥集团档案局",
  245. "sectNo" : "A0022",
  246. "thridId" : "A0022-2020-0000000769",
  247. "writingDate" : 1650384000000,
  248. "year" : "2020"
  249. }
  250. }
  251. ]
  252. },
  253. "aggregations" : {
  254. "yearGroup" : {
  255. "doc_count_error_upper_bound" : 0,
  256. "sum_other_doc_count" : 0,
  257. "buckets" : [
  258. {
  259. "key" : "2020",
  260. "doc_count" : 6
  261. }
  262. ]
  263. },
  264. "archTypeGroup" : {
  265. "doc_count_error_upper_bound" : 0,
  266. "sum_other_doc_count" : 0,
  267. "buckets" : [
  268. {
  269. "key" : "6495573858862336",
  270. "doc_count" : 3,
  271. "secretGroup" : {
  272. "doc_count_error_upper_bound" : 0,
  273. "sum_other_doc_count" : 0,
  274. "buckets" : [
  275. {
  276. "key" : "核心商密",
  277. "doc_count" : 2
  278. },
  279. {
  280. "key" : "普通商密",
  281. "doc_count" : 1
  282. }
  283. ]
  284. }
  285. },
  286. {
  287. "key" : "6485924961527040",
  288. "doc_count" : 1,
  289. "secretGroup" : {
  290. "doc_count_error_upper_bound" : 0,
  291. "sum_other_doc_count" : 0,
  292. "buckets" : [
  293. {
  294. "key" : "普通商密",
  295. "doc_count" : 1
  296. }
  297. ]
  298. }
  299. },
  300. {
  301. "key" : "6485930821313792",
  302. "doc_count" : 1,
  303. "secretGroup" : {
  304. "doc_count_error_upper_bound" : 0,
  305. "sum_other_doc_count" : 0,
  306. "buckets" : [
  307. {
  308. "key" : "普通商密",
  309. "doc_count" : 1
  310. }
  311. ]
  312. }
  313. },
  314. {
  315. "key" : "6489894262050048",
  316. "doc_count" : 1,
  317. "secretGroup" : {
  318. "doc_count_error_upper_bound" : 0,
  319. "sum_other_doc_count" : 0,
  320. "buckets" : [
  321. {
  322. "key" : "核心商密",
  323. "doc_count" : 1
  324. }
  325. ]
  326. }
  327. }
  328. ]
  329. }
  330. }
  331. }

java实现:

  1. SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
  2. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  3. //第一个字段进行分组
  4. TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("yearGroup").field("year.keyword");
  5. //根据第二个字段进行分组
  6. TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("archTypeGroup").field("archTypeId.keyword");
  7. //自己聚合分组,生命方式一样
  8. TermsAggregationBuilder secretGroup = AggregationBuilders.terms("secretGroup").field("secret.keyword");
  9. //只需要平级添加聚合条件即可
  10. sourceBuilder.aggregation(yearGroupAgg);
  11. //设置聚合分组时,同事设置子分组(子层级)
  12. sourceBuilder.aggregation(archTypeGroupAgg.subAggregation(secretGroup));
  13. searchRequest.source(sourceBuilder);

第三部、script实现多字段查询

实现archTypeId和year平级聚合分组,同事查询出archTypeId对应的中文名称archTypeName。其中#split#是自定义的。

kibana:

  1. POST ermsftrv1/_search
  2. {
  3. "aggs": {
  4. "archTypeGroup": {
  5. "terms": {
  6. "script": "doc['archTypeId.keyword'].value +'#split#'+ doc['archTypeName.keyword'].value",
  7. "size": 10
  8. }
  9. },
  10. "yearGroup": {
  11. "terms": {
  12. "field": "year.keyword",
  13. "size": 10
  14. }
  15. }
  16. }
  17. }

结果:

  1. {
  2. "took" : 1,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 6,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "ermsftrv1",
  19. "_type" : "_doc",
  20. "_id" : "6502586031240448",
  21. "_score" : 1.0,
  22. "_source" : {
  23. "annual" : "",
  24. "archName" : "新建文本文档",
  25. "archNo" : "0022-SB0000.TODO-TODO-001",
  26. "archTypeCode" : "SB0000",
  27. "archTypeId" : "6485930821313792",
  28. "archTypeName" : "设备仪器",
  29. "archivedDate" : 1587545484000,
  30. "archivedDep" : "1753-11-11 00:00:00",
  31. "archivedOperator" : "",
  32. "documentPage" : 0,
  33. "entityTypeId" : 1,
  34. "expDate" : -6820704000000,
  35. "fileNo" : "",
  36. "handlerId" : 6502586302145792,
  37. "id" : "6502586031240448",
  38. "pageNum" : "0",
  39. "picPage" : 0,
  40. "responsibleDept" : "",
  41. "responsibleOper" : "hanfeixian",
  42. "savePeriod" : "永久",
  43. "savePeriodId" : "1",
  44. "secret" : "普通商密",
  45. "secretExpDate" : 1650556800000,
  46. "secretId" : "2",
  47. "secretPeriodId" : 1,
  48. "sectId" : "6480640146142464",
  49. "sectName" : "新奥集团档案局",
  50. "sectNo" : "A0022",
  51. "thridId" : "A0022-2020-0000000722",
  52. "writingDate" : 1650556800000,
  53. "year" : "2020"
  54. }
  55. },
  56. {
  57. "_index" : "ermsftrv1",
  58. "_type" : "_doc",
  59. "_id" : "6500384144856320",
  60. "_score" : 1.0,
  61. "_source" : {
  62. "annual" : "",
  63. "archName" : "问题",
  64. "archNo" : "0022-JS0000-TODO.-TODO-027",
  65. "archTypeCode" : "JS0000",
  66. "archTypeId" : "6485924961527040",
  67. "archTypeName" : "建设项目",
  68. "archivedDate" : 1587548214000,
  69. "archivedDep" : "1753-11-11 00:00:00",
  70. "archivedOperator" : "",
  71. "documentPage" : 0,
  72. "entityTypeId" : 1,
  73. "expDate" : -6820704000000,
  74. "fileNo" : "",
  75. "handlerId" : 6502597485647104,
  76. "id" : "6500384144856320",
  77. "pageNum" : "1",
  78. "picPage" : 0,
  79. "responsibleDept" : "",
  80. "responsibleOper" : "hanfeixian",
  81. "savePeriod" : "永久",
  82. "savePeriodId" : "1",
  83. "secret" : "普通商密",
  84. "secretExpDate" : 1650038400000,
  85. "secretId" : "2",
  86. "secretPeriodId" : 9,
  87. "sectId" : "6480640146142464",
  88. "sectName" : "新奥集团档案局",
  89. "sectNo" : "A0022",
  90. "thridId" : "A0022-2020-0000000723",
  91. "writingDate" : 1650038400000,
  92. "year" : "2020"
  93. }
  94. },
  95. {
  96. "_index" : "ermsftrv1",
  97. "_type" : "_doc",
  98. "_id" : "6503214760639744",
  99. "_score" : 1.0,
  100. "_source" : {
  101. "annual" : "2020",
  102. "archName" : "曹操出行-2行程单",
  103. "archNo" : "0022-ZZ0100.TODO-03-006",
  104. "archTypeCode" : "ZZ0100",
  105. "archTypeId" : "6489894262050048",
  106. "archTypeName" : "01 企业证照",
  107. "archivedDate" : 1587699428000,
  108. "archivedDep" : "1753-11-11 00:00:00",
  109. "archivedOperator" : "",
  110. "documentPage" : 0,
  111. "entityTypeId" : 1,
  112. "expDate" : -6820704000000,
  113. "fileNo" : "",
  114. "handlerId" : 6503216857251072,
  115. "id" : "6503214760639744",
  116. "pageNum" : "0",
  117. "picPage" : 0,
  118. "responsibleDept" : "",
  119. "responsibleOper" : "zhangjunk",
  120. "savePeriod" : "30年",
  121. "savePeriodId" : "3",
  122. "secret" : "核心商密",
  123. "secretExpDate" : 1638633600000,
  124. "secretId" : "3",
  125. "secretPeriodId" : 1,
  126. "sectId" : "6480626827621632",
  127. "sectName" : "新奥集团股份有限公司",
  128. "sectNo" : "A0022",
  129. "thridId" : "A0022-2020-0000000187",
  130. "writingDate" : 1638633600000,
  131. "year" : "2020"
  132. }
  133. },
  134. {
  135. "_index" : "ermsftrv1",
  136. "_type" : "_doc",
  137. "_id" : "6503218290695424",
  138. "_score" : 1.0,
  139. "_source" : {
  140. "annual" : "",
  141. "archName" : "消息接入规范",
  142. "archNo" : "0022-ZZ0200.TODO-K093-002",
  143. "archTypeCode" : "ZZ0200",
  144. "archTypeId" : "6495573858862336",
  145. "archTypeName" : "02 领导证照",
  146. "archivedDate" : 1587709784000,
  147. "archivedDep" : "1753-11-11 00:00:00",
  148. "archivedOperator" : "",
  149. "documentPage" : 0,
  150. "entityTypeId" : 2,
  151. "expDate" : 1619258366000,
  152. "fileNo" : "",
  153. "handlerId" : 6503218290752768,
  154. "id" : "6503218290695424",
  155. "pageNum" : "0",
  156. "picPage" : 0,
  157. "responsibleDept" : "",
  158. "responsibleOper" : "zhangjunk",
  159. "savePeriod" : "永久",
  160. "savePeriodId" : "1",
  161. "secret" : "核心商密",
  162. "secretExpDate" : 1808560781000,
  163. "secretId" : "3",
  164. "secretPeriodId" : 7,
  165. "sectId" : "6480626827621632",
  166. "sectName" : "新奥集团股份有限公司",
  167. "sectNo" : "A0022",
  168. "thridId" : "A0022-2020-0000000318",
  169. "writingDate" : 1584547200000,
  170. "year" : "2020"
  171. }
  172. },
  173. {
  174. "_index" : "ermsftrv1",
  175. "_type" : "_doc",
  176. "_id" : "6503265140862208",
  177. "_score" : 1.0,
  178. "_source" : {
  179. "annual" : "",
  180. "archName" : "新奥档案系统-项目进度计划-20200408",
  181. "archNo" : "0022-ZZ0200.TODO-null-010",
  182. "archTypeCode" : "ZZ0200",
  183. "archTypeId" : "6495573858862336",
  184. "archTypeName" : "02 领导证照",
  185. "archivedDate" : 1587711282000,
  186. "archivedDep" : "1753-11-11 00:00:00",
  187. "archivedOperator" : "",
  188. "documentPage" : 0,
  189. "entityTypeId" : 1,
  190. "expDate" : -6820704000000,
  191. "fileNo" : "",
  192. "handlerId" : 6503265140927744,
  193. "id" : "6503265140862208",
  194. "pageNum" : "0",
  195. "picPage" : 0,
  196. "responsibleDept" : "",
  197. "responsibleOper" : "zhangjunk",
  198. "savePeriod" : "永久",
  199. "savePeriodId" : "1",
  200. "secret" : "核心商密",
  201. "secretExpDate" : 1649347200000,
  202. "secretId" : "3",
  203. "secretPeriodId" : 1,
  204. "sectId" : "6480640146142464",
  205. "sectName" : "新奥集团档案局",
  206. "sectNo" : "A0022",
  207. "thridId" : "A0022-2020-0000000768",
  208. "writingDate" : 1649347200000,
  209. "year" : "2020"
  210. }
  211. },
  212. {
  213. "_index" : "ermsftrv1",
  214. "_type" : "_doc",
  215. "_id" : "6503265140526336",
  216. "_score" : 1.0,
  217. "_source" : {
  218. "annual" : "",
  219. "archName" : "新奥档案系统-项目进度计划-20200415",
  220. "archNo" : "0022-ZZ0200.TODO-null-011",
  221. "archTypeCode" : "ZZ0200",
  222. "archTypeId" : "6495573858862336",
  223. "archTypeName" : "02 领导证照",
  224. "archivedDate" : 1587711282000,
  225. "archivedDep" : "1753-11-11 00:00:00",
  226. "archivedOperator" : "",
  227. "documentPage" : 0,
  228. "entityTypeId" : 1,
  229. "expDate" : -6820704000000,
  230. "fileNo" : "",
  231. "handlerId" : 6503265411443968,
  232. "id" : "6503265140526336",
  233. "pageNum" : "0",
  234. "picPage" : 0,
  235. "responsibleDept" : "",
  236. "responsibleOper" : "zhangjunk",
  237. "savePeriod" : "永久",
  238. "savePeriodId" : "1",
  239. "secret" : "普通商密",
  240. "secretExpDate" : 1650384000000,
  241. "secretId" : "2",
  242. "secretPeriodId" : 1,
  243. "sectId" : "6480640146142464",
  244. "sectName" : "新奥集团档案局",
  245. "sectNo" : "A0022",
  246. "thridId" : "A0022-2020-0000000769",
  247. "writingDate" : 1650384000000,
  248. "year" : "2020"
  249. }
  250. }
  251. ]
  252. },
  253. "aggregations" : {
  254. "yearGroup" : {
  255. "doc_count_error_upper_bound" : 0,
  256. "sum_other_doc_count" : 0,
  257. "buckets" : [
  258. {
  259. "key" : "2020",
  260. "doc_count" : 6
  261. }
  262. ]
  263. },
  264. "archTypeGroup" : {
  265. "doc_count_error_upper_bound" : 0,
  266. "sum_other_doc_count" : 0,
  267. "buckets" : [
  268. {
  269. "key" : "6495573858862336#split#02 领导证照",
  270. "doc_count" : 3
  271. },
  272. {
  273. "key" : "6485924961527040#split#建设项目",
  274. "doc_count" : 1
  275. },
  276. {
  277. "key" : "6485930821313792#split#设备仪器",
  278. "doc_count" : 1
  279. },
  280. {
  281. "key" : "6489894262050048#split#01 企业证照",
  282. "doc_count" : 1
  283. }
  284. ]
  285. }
  286. }
  287. }

java实现:

  1. SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
  2. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  3. //第一个字段进行分组
  4. TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("yearGroup").field("year.keyword");
  5. //第二个字段进行分组,使用script方式拼接返回值,但是要保证archTypeId和archTypeName是一对一的
  6. Script script = new Script("doc['archTypeId.keyword'].value +'#split#'+ doc['archTypeName.keyword'].value");
  7. TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("archTypeGroup").script(script);
  8. //添加aggregation
  9. sourceBuilder.aggregation(yearGroupAgg);
  10. sourceBuilder.aggregation(archTypeGroupAgg);
  11. searchRequest.source(sourceBuilder);

刚接触es,不熟悉,最新版本的教程也不多。实际上基本是通过kibana敲命令琢磨出来的。建议装一个kibana或者head来辅助自己熟悉es。

四、分词的字段做聚合

这种情况,先看常规做法。这里以archTypeCode2和archTypeName做平级聚合,但是archTypeName字段是分词字段。往下看:

kibana:

  1. POST ermsftrv1/_search
  2. {
  3. "aggs": {
  4. "archTypeGroup": {
  5. "terms": {
  6. "field": "archTypeCode2",
  7. "size": 10
  8. }
  9. },
  10. "yearGroup": {
  11. "terms": {
  12. "field": "archTypeName",
  13. "size": 10
  14. }
  15. }
  16. }
  17. }

聚合结果:

  1. "aggregations" : {
  2. "yearGroup" : {
  3. "doc_count_error_upper_bound" : 0,
  4. "sum_other_doc_count" : 4,
  5. "buckets" : [
  6. {
  7. "key" : "证照",
  8. "doc_count" : 20
  9. },
  10. {
  11. "key" : "01",
  12. "doc_count" : 10
  13. },
  14. {
  15. "key" : "企业",
  16. "doc_count" : 10
  17. },
  18. {
  19. "key" : "02",
  20. "doc_count" : 9
  21. },
  22. {
  23. "key" : "领导",
  24. "doc_count" : 9
  25. },
  26. {
  27. "key" : "仪器",
  28. "doc_count" : 3
  29. },
  30. {
  31. "key" : "类型",
  32. "doc_count" : 3
  33. },
  34. {
  35. "key" : "设备",
  36. "doc_count" : 3
  37. },
  38. {
  39. "key" : "声像",
  40. "doc_count" : 2
  41. },
  42. {
  43. "key" : "建设",
  44. "doc_count" : 2
  45. }
  46. ]
  47. },
  48. "archTypeGroup" : {
  49. "doc_count_error_upper_bound" : 0,
  50. "sum_other_doc_count" : 0,
  51. "buckets" : [
  52. {
  53. "key" : "ZZ",
  54. "doc_count" : 20
  55. },
  56. {
  57. "key" : "SB",
  58. "doc_count" : 3
  59. },
  60. {
  61. "key" : "JS",
  62. "doc_count" : 2
  63. },
  64. {
  65. "key" : "SX",
  66. "doc_count" : 2
  67. }
  68. ]
  69. }
  70. }

archTypeName这个聚合出现了:证照、01....等,这些是被分词后的。所以结果并不理想,我们这样解决。

在设置mapping时,archTypeName字段这么设置即可,

  1. "archTypeName" : {
  2. "type" : "text",
  3. "fields" : {
  4. "raw" : {
  5. "type" : "keyword" #如果不设置keyword索引在聚合时将会使用已分解后的词
  6. }
  7. },
  8. "analyzer" : "ik_max_word",
  9. "fielddata" : true
  10. }

这样正常使用archTypeName还是分词搜索即可,当我们需要使用archTypeName.keyword时只需要写archTypeName.raw.keyword即可,

修改后的kibana:

  1. POST ermsftrv1/_search
  2. {
  3. "aggs": {
  4. "archTypeGroup": {
  5. "terms": {
  6. "field": "archTypeCode2",
  7. "size": 10
  8. }
  9. },
  10. "yearGroup": {
  11. "terms": {
  12. "field": "archTypeName.raw",
  13. "size": 10
  14. }
  15. }
  16. }
  17. }

聚合结果:01 企业证照、设备仪器等既可以当做完整的词来聚合展示了。

  1. "aggregations" : {
  2. "yearGroup" : {
  3. "doc_count_error_upper_bound" : 0,
  4. "sum_other_doc_count" : 0,
  5. "buckets" : [
  6. {
  7. "key" : "01 企业证照",
  8. "doc_count" : 10
  9. },
  10. {
  11. "key" : "02 领导证照",
  12. "doc_count" : 9
  13. },
  14. {
  15. "key" : "设备仪器",
  16. "doc_count" : 3
  17. },
  18. {
  19. "key" : "声像类型",
  20. "doc_count" : 2
  21. },
  22. {
  23. "key" : "建设项目",
  24. "doc_count" : 2
  25. },
  26. {
  27. "key" : "证照类型",
  28. "doc_count" : 1
  29. }
  30. ]
  31. },
  32. "archTypeGroup" : {
  33. "doc_count_error_upper_bound" : 0,
  34. "sum_other_doc_count" : 0,
  35. "buckets" : [
  36. {
  37. "key" : "ZZ",
  38. "doc_count" : 20
  39. },
  40. {
  41. "key" : "SB",
  42. "doc_count" : 3
  43. },
  44. {
  45. "key" : "JS",
  46. "doc_count" : 2
  47. },
  48. {
  49. "key" : "SX",
  50. "doc_count" : 2
  51. }
  52. ]
  53. }
  54. }

五、实践代码

献上最终版代码,其中有大部搜索情况下的java实现方式,可以参考。

  1. //全文检索字段列表
  2. private final String[] MULTI_MATCH_FILDS ={
  3. "archName","archNo","archTypeCode","archivedDept","archTypeName","archivedYear","createUser","notes",
  4. "reorganizeOper","responsibleOper","savePeriod","secret","sectName","sectNo","writingDate","writingYear",
  5. "year","signatory"
  6. };
  7. //全文检索高亮字段列表
  8. private final String[] MULTI_MATCH_HIGHLIGHT_FILDS ={
  9. "archName","archNo","archTypeCode","archivedDept","archTypeName","archivedYear","createUser","notes",
  10. "reorganizeOper","responsibleOper","savePeriod","secret","sectName","sectNo","writingDate","writingYear",
  11. "year","signatory"
  12. };
  13. /**
  14. * 全文mapping中会被分词,并且含有keyword的字段
  15. */
  16. private final List<String> MULTI_MATCH_KEYWORD_FIELDS = Arrays.asList(
  17. "archName", "archNo","archTypeCode","archTypeName","archivedDate","archivedDept",
  18. "archivedOperator","savePeriod","secretId","sectName", "sectNo","ermsProjectNo",
  19. "productNo", "factoryNumber","volumeHao","ERMS_META_DATA_METADATA_EMPLOYEE_NO",
  20. "ermsProjectName","dossierName", "dossierArchivedDept","equipmentUse", "ERMS_META_DATA_METADATA_ENTERPRISE_NAME",
  21. "ERMS_META_DATA_METADATA_FIRST_PARTY","ERMS_META_DATA_METADATA_SECOND_PARTY",
  22. "ERMS_META_DATA_METADATA_THIRD_PARTY","ERMS_META_DATA_METADATA_CONTRACT_OBJECT","signatory"
  23. );
  24. /**
  25. * bool查询的使用
  26. * Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型
  27. *
  28. * must
  29. * 返回的文档必须满足must子句的条件,并且参与计算分值
  30. *
  31. * filter
  32. * 返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值
  33. *
  34. * should
  35. * 返回的文档可能满足should子句的条件.在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回.minimum_should_match参数定义了至少满足几个子句.
  36. *
  37. * must_not
  38. * 返回的文档必须不满足定义的条件
  39. *
  40. * 如果一个查询既有filter又有should,那么至少包含一个should子句.
  41. *
  42. * bool查询也支持禁用协同计分选项disable_coord.一般计算分值的因素取决于所有的查询条件.
  43. *
  44. * bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值.
  45. *
  46. * @param request
  47. * @return
  48. */
  49. @Override
  50. public Map<String, Object> bindAdvancedQueryGrid(AdvancedQueryParam request) {
  51. log.info("context:{}", Context.getCurrentUser());
  52. log.info("查询参数::::{}",request);
  53. Map resMap = new HashMap();
  54. //必要参数校验
  55. if(!request.getAdvanced() && StringUtils.isBlank(request.getKey())&&
  56. StringUtils.isBlank(request.getQueryItem())){//不是高级搜索的时候需要穿key
  57. resMap.put("errMsg","关键字不能为空");
  58. resMap.put("errCode","-1");
  59. return resMap;
  60. }
  61. SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
  62. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  63. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  64. // 高级搜索条件
  65. if (request.getAdvanced()) {//高级搜索参数拼接
  66. //添加范围
  67. List<Integer> range = request.getRange();
  68. if(ObjectUtils.isEmpty(range) || (!range.contains(3) && !range.contains(1)))return resMap;//没选范围返回空
  69. if(range.size()==1){//档案库和预归档只选了一个库的话
  70. if (range.contains(3)){//档案库
  71. boolQueryBuilder.must(QueryBuilders.termQuery("archStatus",3));
  72. }else if(range.contains(1)){//我要归档
  73. boolQueryBuilder.must(QueryBuilders.termQuery("archStatus",1));
  74. }
  75. }
  76. List<AdvancedCondition> advancedConditions = request.getAdvancedConditions();
  77. for (AdvancedCondition condition:advancedConditions) {
  78. //主要参数为空时跳过
  79. if(StringUtils.isBlank(condition.getValue()) ||
  80. StringUtils.isBlank(condition.getBelong()) ||
  81. (("9".equals(condition.getBelong()) || "10".equals(condition.getBelong()))
  82. && StringUtils.isBlank(condition.getInput())))continue;
  83. //如果包含标题内容,添加搜索key以便查询电子文件
  84. if("archName".equals(condition.getValue()) && StringUtils.isBlank(request.getKey())){
  85. request.setKey(condition.getInput());
  86. }
  87. //查询条件构建
  88. QueryBuilder termQueryBuilder;
  89. /**
  90. * 条件关系
  91. * { id: 1, label: '包含', value: '1' },
  92. * { id: 2, label: '小于', value: '2' },
  93. * { id: 3, label: '小于等于', value: '3' },
  94. * { id: 4, label: '不等于', value: '4' },
  95. * { id: 5, label: '等于', value: '5' },
  96. * { id: 6, label: '大于', value: '6' },
  97. * { id: 7, label: '大于等于', value: '7' },
  98. * { id: 8, label: '不包含', value: '8' },
  99. * { id: 9, label: '为空', value: '9' },
  100. * { id: 10, label: '不为空', value: '10' },
  101. * { id: 11, label: '以之结尾', value: '11' },
  102. * { id: 12, label: '以之开头', value: '12' }
  103. */
  104. switch (condition.getBelong()){
  105. case "1":
  106. termQueryBuilder = QueryBuilders.matchQuery(condition.getValue(), condition.getInput());
  107. break;
  108. case "2":
  109. termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).lt(condition.getInput());
  110. break;
  111. case "3":
  112. termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).lte(condition.getInput());
  113. break;
  114. case "4":
  115. termQueryBuilder = boolQueryBuilder.mustNot(QueryBuilders.termQuery(condition.getValue(), condition.getInput()));
  116. break;
  117. case "5":
  118. if(MULTI_MATCH_KEYWORD_FIELDS.contains(condition.getValue())){
  119. termQueryBuilder = QueryBuilders.termQuery(condition.getValue()+".keyword", condition.getInput());
  120. }else {
  121. termQueryBuilder = QueryBuilders.termQuery(condition.getValue(), condition.getInput());
  122. }
  123. break;
  124. case "6":
  125. termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).gt(condition.getInput());
  126. break;
  127. case "7":
  128. termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).gte(condition.getInput());
  129. break;
  130. case "8":
  131. termQueryBuilder = boolQueryBuilder.mustNot(QueryBuilders.matchQuery(condition.getValue(), condition.getInput()));
  132. break;
  133. case "9":
  134. termQueryBuilder = boolQueryBuilder.mustNot(QueryBuilders.existsQuery(condition.getValue()));
  135. break;
  136. case "10":
  137. termQueryBuilder = QueryBuilders.existsQuery(condition.getValue());
  138. break;
  139. case "11"://? 匹配任意字符,* 匹配0个或多个字符
  140. termQueryBuilder = QueryBuilders.wildcardQuery(condition.getValue(), "*"+condition.getInput());
  141. break;
  142. case "12":
  143. termQueryBuilder = QueryBuilders.prefixQuery(condition.getValue(), condition.getInput());
  144. break;
  145. default:
  146. continue;
  147. }
  148. if(StringUtils.isNotBlank(condition.getLogic()) && "2".equals(condition.getLogic())){//或
  149. boolQueryBuilder.should(termQueryBuilder);
  150. }else {//与
  151. boolQueryBuilder.must(termQueryBuilder);
  152. }
  153. }
  154. }else {
  155. //全文检索只搜档案库
  156. boolQueryBuilder.must(QueryBuilders.termQuery("archStatus",3));
  157. //全文检索--模糊查询条件
  158. boolQueryBuilder.must(QueryBuilders.multiMatchQuery(request.getKey(),MULTI_MATCH_FILDS));//取消全文检索,改为单属性选择搜索
  159. }
  160. //检索中--输入条件--档号
  161. if (!ObjectUtils.isEmpty(request.getArchNo())) {
  162. boolQueryBuilder.must(QueryBuilders.matchQuery("archNo", request.getArchNo()));
  163. }
  164. //检索中--输入条件--档案名称
  165. if (!ObjectUtils.isEmpty(request.getArchName())) {
  166. boolQueryBuilder.must(QueryBuilders.matchQuery("archName", request.getArchName()));
  167. }
  168. //检索中--输入条件--归档时间
  169. if (!ObjectUtils.isEmpty(request.getStartDate()) || !ObjectUtils.isEmpty(request.getEndDate())) {
  170. Object start = request.getStartDate();
  171. Object end = request.getEndDate();
  172. boolQueryBuilder.must(QueryBuilders.rangeQuery("archivedDate").from(start+" 00:00:00.000").to(end+" 59:59:59.999"));
  173. }
  174. //检索中--分类条件--门类
  175. if (!ObjectUtils.isEmpty(request.getArchTypeCode2())) {
  176. boolQueryBuilder.must(QueryBuilders.termsQuery("archTypeCode2", request.getArchTypeCode2()));
  177. }
  178. //检索中--分类条件--全宗查询条件,非全库且有全宗id时
  179. if (!ObjectUtils.isEmpty(request.getSectId())) {
  180. boolQueryBuilder.must(QueryBuilders.termQuery("sectId", request.getSectId()));
  181. }
  182. //检索中--分类条件--保管期限查询条件
  183. if (!ObjectUtils.isEmpty(request.getSavePeriodId())) {
  184. boolQueryBuilder.must(QueryBuilders.termQuery("savePeriodId", request.getSavePeriodId()));
  185. }
  186. //检索中--分类条件--成文日期查询条件
  187. if (!ObjectUtils.isEmpty(request.getWritingYear())) {
  188. boolQueryBuilder.must(QueryBuilders.termQuery("writingYear", request.getWritingYear()));
  189. }
  190. //2.5是否聚合 //TODO
  191. //加入聚合
  192. if (request.getAggregation()) {
  193. //成文年份聚合
  194. TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("writingYearGroup").field("writingYear");
  195. sourceBuilder.aggregation(yearGroupAgg);
  196. //门类、档案类型聚合
  197. TermsAggregationBuilder archTypeCode2Agg = AggregationBuilders.terms("archTypeCode2Group").field("archTypeCode2");
  198. sourceBuilder.aggregation(archTypeCode2Agg);
  199. //全宗聚合
  200. Script script = new Script("doc['sectId'].value +'#split#'+ doc['sectName.keyword'].value");
  201. TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("sectGroup").script(script);
  202. sourceBuilder.aggregation(archTypeGroupAgg);
  203. //保管期限聚合
  204. TermsAggregationBuilder savePeriodAgg = AggregationBuilders.terms("savePeriodGroup").field("savePeriodId");
  205. sourceBuilder.aggregation(savePeriodAgg);
  206. }
  207. // 设置分页
  208. sourceBuilder.query(boolQueryBuilder);
  209. Integer offSet = 0;
  210. Integer limit = 10;
  211. if (!ObjectUtils.isEmpty(request.getPage()) && !ObjectUtils.isEmpty(request.getSize())) {
  212. Integer page = (Integer) request.getPage();
  213. limit = (Integer) request.getSize();
  214. offSet = (page - 1) * limit;
  215. }
  216. sourceBuilder.from(offSet);
  217. sourceBuilder.size(limit);
  218. sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
  219. //TODO 设置高亮
  220. //添加检索条件
  221. searchRequest.source(sourceBuilder);
  222. //2.构建查询结果
  223. try {
  224. SearchResponse searchResponse = es.searchDocument(searchRequest);
  225. if(searchResponse.status() != RestStatus.OK){
  226. resMap.put("errMsg","查询数据失败");
  227. resMap.put("errCode","-1");
  228. return resMap;
  229. }
  230. SearchHits hits = searchResponse.getHits();
  231. //2.1构建返回总数
  232. Long count = hits.getTotalHits().value;
  233. //2.2构建返回内容
  234. ES_ARCHIVED_FORM_RESPONSE response = new ES_ARCHIVED_FORM_RESPONSE();
  235. List<ESArchObject> list = new ArrayList<>();
  236. //字段遮挡 -- 获取可见权限
  237. final List<ErmsDigitalRights> ermsDigitalRights = digitalRightsService.getErmsDigitalRights();
  238. Map<String, Set<String>> archTypeIdMap = ermsDigitalRights.stream()
  239. .filter(r -> r.getErmsArchTypeId() != null)
  240. .collect(Collectors.groupingBy(r -> String.valueOf(r.getErmsSectId()),
  241. Collectors.mapping(r -> String.valueOf(r.getErmsArchTypeId()),
  242. Collectors.toSet())));
  243. for (SearchHit hit : hits.getHits()) {
  244. ESArchObject esArchObject = JSON.parseObject(hit.getSourceAsString(), ESArchObject.class);
  245. //字段遮挡 -- 替换遮挡属性
  246. hiddenField(archTypeIdMap.get(esArchObject.getSectId()), esArchObject);
  247. list.add(esArchObject);
  248. }
  249. response.setForms(list);
  250. if (request.getAggregation()) {//构建聚合
  251. Aggregations aggregations = searchResponse.getAggregations();
  252. //构建成文年份分组
  253. Terms yearGroup = aggregations.get("writingYearGroup");
  254. if(!CollectionUtils.isEmpty(yearGroup.getBuckets())){
  255. List<Map> years = new ArrayList<>();
  256. for (Terms.Bucket bucket : yearGroup.getBuckets()) {
  257. Map<String,Object> iterm = new HashMap<>();
  258. putGroupIterm(bucket, iterm, bucket.getKeyAsString(), bucket.getKeyAsString());
  259. years.add(iterm);
  260. }
  261. response.setWritingYearGroup(years);
  262. }
  263. //构建档案类型分组
  264. Terms archTypeCode2Group = aggregations.get("archTypeCode2Group");
  265. if(!CollectionUtils.isEmpty(archTypeCode2Group.getBuckets())){
  266. List<Map> archTypeCode2s = new ArrayList<>();
  267. for (Terms.Bucket bucket : archTypeCode2Group.getBuckets()) {
  268. Map<String,Object> iterm = new HashMap<>();
  269. putGroupIterm(bucket, iterm, bucket.getKeyAsString(), bucket.getKeyAsString());
  270. archTypeCode2s.add(iterm);
  271. }
  272. response.setArchTypeCode2Group(archTypeCode2s);
  273. }
  274. //构建全宗分组
  275. Terms sectGroup = aggregations.get("sectGroup");
  276. if(!CollectionUtils.isEmpty(sectGroup.getBuckets())){
  277. List<Map> sects = new ArrayList<>();
  278. for (Terms.Bucket bucket : sectGroup.getBuckets()) {
  279. if(StringUtils.isNotBlank(bucket.getKeyAsString()) && bucket.getKeyAsString().contains("#split#")){
  280. String[] split = bucket.getKeyAsString().split("#split#");
  281. Map<String,Object> iterm = new HashMap<>();
  282. putGroupIterm(bucket, iterm, split[0], split[1]);
  283. sects.add(iterm);
  284. }
  285. }
  286. response.setSectGroup(sects);
  287. }
  288. //构建保管期限分组
  289. Terms savePeriodGroup = aggregations.get("savePeriodGroup");
  290. if(!CollectionUtils.isEmpty(savePeriodGroup.getBuckets())){
  291. List<Map> savePeriods = new ArrayList<>();
  292. for (Terms.Bucket bucket : savePeriodGroup.getBuckets()) {
  293. Map<String,Object> iterm = new HashMap<>();
  294. putGroupIterm(bucket, iterm, bucket.getKeyAsString(), bucket.getKeyAsString());
  295. savePeriods.add(iterm);
  296. }
  297. response.setSavePeriodGroup(savePeriods);
  298. }
  299. //获取电子文件聚合
  300. if (!request.getAdvanced() && StringUtils.isNotBlank(request.getKey())){
  301. try {
  302. ElectronicSearchParam param = new ElectronicSearchParam();
  303. BeanUtils.copyProperties(param,request);
  304. if(StringUtils.isNotBlank(param.getKey())){
  305. response.setElectronicGroup(eleFacetSearchRest(param));//电子文件分类统计
  306. }
  307. } catch (IllegalAccessException e) {
  308. e.printStackTrace();
  309. } catch (InvocationTargetException e) {
  310. e.printStackTrace();
  311. }
  312. }
  313. }
  314. //TODO 查询的同时 往 检索历史表存入检索的
  315. /*if (!ObjectUtils.isEmpty(request.get("archName"))||!ObjectUtils.isEmpty(request.get("IDes"))||!ObjectUtils.isEmpty(request.get("archNo"))||!ObjectUtils.isEmpty(request.get("name"))|| !ObjectUtils.isEmpty(request.get("end"))||!ObjectUtils.isEmpty(request.get("start"))){
  316. ERMSSearchHistory ermsSearchHistory=new ERMSSearchHistory();
  317. // Context.getERMSSearchHistoryService().createSearchHistory(ermsSearchHistory,request,count);
  318. }*/
  319. //3.查询到的值封装并返回
  320. response.setCount(count);
  321. resMap.put("data", response);
  322. } catch (IOException e) {
  323. e.printStackTrace();
  324. }
  325. return resMap;
  326. }

环境搭建可见:

docker swarm集群下部署elasticsearch7.6.2集群+kibana7.6.2+es-head+中文分词

linux Centos7 安裝搭建elasticsearch7.6.2+kibana7.6.2+中文分词7.6.2详解

gogogo!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/415650
推荐阅读
相关标签
  

闽ICP备14008679号