SolrUtil.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. eeepackage com.yihu.base;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.apache.solr.client.solrj.SolrClient;
  4. import org.apache.solr.client.solrj.SolrQuery;
  5. import org.apache.solr.client.solrj.response.*;
  6. import org.apache.solr.common.SolrDocumentList;
  7. import org.apache.solr.common.params.FacetParams;
  8. import org.apache.solr.common.util.NamedList;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.config.ConfigurableBeanFactory;
  11. import org.springframework.context.annotation.Scope;
  12. import org.springframework.stereotype.Service;
  13. import java.util.Date;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. /**
  18. * Solr底层查询类
  19. *
  20. * @author hzp
  21. * @version 1.0
  22. * @created 2016.04.26
  23. */
  24. @Service
  25. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  26. public class SolrUtil {
  27. @Autowired
  28. SolrPool pool;
  29. private final static String ASC = "asc";
  30. /**
  31. * 获取查询耗时
  32. */
  33. private int qtime;
  34. private int getQtime() {
  35. return qtime;
  36. }
  37. /************************** 查询操作 *****************************************************/
  38. /**
  39. * 简单查询方法
  40. */
  41. public SolrDocumentList query(String tablename, String q, Map<String, String> sort, long start, long rows) throws Exception {
  42. return query(tablename, q, null, sort, start, rows);
  43. }
  44. /**
  45. * Solr查询方法
  46. *
  47. * @param q 查询字符串
  48. * @param fq 过滤查询
  49. * @param sort 过滤条件
  50. * @param start 查询起始行
  51. * @param rows 查询行数
  52. * @return
  53. */
  54. public SolrDocumentList query(String core, String q, String fq, Map<String, String> sort, long start, long rows) throws Exception {
  55. SolrClient conn = pool.getConnection(core);
  56. SolrQuery query = new SolrQuery();
  57. if (null != q && !q.equals("")) //设置查询条件
  58. {
  59. query.setQuery(q);
  60. } else {
  61. query.setQuery("*:*");
  62. }
  63. if (null != fq && !fq.equals("")) //设置过滤条件
  64. {
  65. query.setFilterQueries(fq);
  66. }
  67. query.setStart(Integer.parseInt(String.valueOf(start)));//设置查询起始行
  68. query.setRows(Integer.parseInt(String.valueOf(rows)));//设置查询行数
  69. //设置排序
  70. if (sort != null) {
  71. for (Object co : sort.keySet()) {
  72. if (ASC == sort.get(co).toLowerCase() || ASC.equals(sort.get(co).toLowerCase())) {
  73. query.addSort(co.toString(), SolrQuery.ORDER.asc);
  74. } else {
  75. query.addSort(co.toString(), SolrQuery.ORDER.desc);
  76. }
  77. }
  78. }
  79. QueryResponse rsp = conn.query(query);
  80. qtime = rsp.getQTime();
  81. System.out.print("Solr Query Time:" + qtime);
  82. SolrDocumentList docs = rsp.getResults();
  83. pool.close(core); //释放连接
  84. return docs;
  85. }
  86. /******************************* Count 统计 ***********************************************/
  87. /**
  88. * 总数查询方法
  89. */
  90. public long count(String core, String q) throws Exception {
  91. return count(core, q, null);
  92. }
  93. /**
  94. * 总数查询方法
  95. */
  96. public long count(String core, String q, String fq) throws Exception {
  97. SolrClient conn = pool.getConnection(core);
  98. SolrQuery query = new SolrQuery();
  99. if (null != q && !q.equals("")) //设置查询条件
  100. {
  101. query.setQuery(q);
  102. } else {
  103. query.setQuery("*:*");
  104. }
  105. if (null != fq && !fq.equals("")) //设置过滤条件
  106. {
  107. query.setFilterQueries(fq);
  108. }
  109. query.setStart(0);
  110. query.setRows(0);
  111. QueryResponse rsp = conn.query(query);
  112. Integer start = (int)rsp.getResults().getNumFound();
  113. query.setStart(start);
  114. rsp = conn.query(query);
  115. qtime = rsp.getQTime();
  116. System.out.print("Solr Count Time:" + qtime);
  117. SolrDocumentList docs = rsp.getResults();
  118. pool.close(core);
  119. return docs.getNumFound();
  120. }
  121. /**
  122. * 单组分组Count统计(start从0开始)
  123. */
  124. public Map<String, Long> groupCount(String core, String q, String fq, String groupField, int start, int rows) throws Exception {
  125. SolrClient conn = pool.getConnection(core);
  126. SolrQuery query = new SolrQuery();
  127. if (null != q && !q.equals("")) //设置查询条件
  128. {
  129. query.setQuery(q);
  130. } else {
  131. query.setQuery("*:*");
  132. }
  133. if (null != fq && !fq.equals("")) //设置过滤条件
  134. {
  135. query.setFilterQueries(fq);
  136. }
  137. query.setFacet(true);//设置facet=on
  138. query.setRows(0);
  139. query.addFacetField(groupField);
  140. query.setFacetLimit(rows);//限制每次返回结果数
  141. query.set(FacetParams.FACET_OFFSET, start);
  142. query.setFacetMissing(false);//不统计null的值
  143. query.setFacetMinCount(0);// 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
  144. QueryResponse rsp = conn.query(query);
  145. List<FacetField.Count> countList = rsp.getFacetField(groupField).getValues();
  146. qtime = rsp.getQTime();
  147. System.out.print("Solr Group Time:" + qtime);
  148. Map<String, Long> rmap = new HashMap<String, Long>();
  149. for (FacetField.Count count : countList) {
  150. if (count.getCount() > 0)
  151. rmap.put(count.getName(), (long) count.getCount());
  152. }
  153. pool.close(core);
  154. return rmap;
  155. }
  156. /**
  157. * 多组分组Count(独立计算)
  158. */
  159. public List<FacetField> groupCount(String core, String q, String fq, String[] groups) throws Exception {
  160. SolrClient conn = pool.getConnection(core);
  161. SolrQuery query = new SolrQuery();
  162. if (null != q && !q.equals("")) //设置查询条件
  163. {
  164. query.setQuery(q);
  165. } else {
  166. query.setQuery("*:*");
  167. }
  168. if (null != fq && !fq.equals("")) //设置过滤条件
  169. {
  170. query.setFilterQueries(fq);
  171. }
  172. query.setFacet(true);//设置facet=on
  173. query.setRows(0);
  174. query.addFacetField(groups);
  175. query.setFacetLimit(1000);//限制每次返回结果数
  176. query.set(FacetParams.FACET_OFFSET, 0);
  177. query.setFacetMissing(true);//不统计null的值
  178. query.setFacetMinCount(0);// 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
  179. QueryResponse rsp = conn.query(query);
  180. qtime = rsp.getQTime();
  181. System.out.print("Solr Group Time:" + qtime);
  182. List<FacetField> facets = rsp.getFacetFields();
  183. pool.close(core);
  184. return facets;
  185. }
  186. /**
  187. * 多组分组Count统计(关联计算)
  188. *
  189. * @return
  190. */
  191. public List<PivotField> groupCountMult(String core, String q, String fq, String groupFields, int start, int rows) throws Exception {
  192. SolrClient conn = pool.getConnection(core);
  193. SolrQuery query = new SolrQuery();
  194. if (null != q && !q.equals("")) //设置查询条件
  195. {
  196. query.setQuery(q);
  197. } else {
  198. query.setQuery("*:*");
  199. }
  200. if (null != fq && !fq.equals("")) //设置过滤条件
  201. {
  202. query.setFilterQueries(fq);
  203. }
  204. query.setFacet(true);//设置facet=on
  205. query.setRows(0);
  206. query.addFacetPivotField(groupFields);
  207. query.setFacetLimit(rows);//限制每次返回结果数
  208. query.setFacetMissing(false);//不统计null的值
  209. query.setFacetMinCount(0);// 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
  210. QueryResponse rsp = conn.query(query);
  211. qtime = rsp.getQTime();
  212. System.out.print("Solr Group Time:" + qtime);
  213. NamedList<List<PivotField>> namedList = rsp.getFacetPivot();
  214. pool.close(core);
  215. if (namedList != null && namedList.size() > 0) {
  216. return namedList.getVal(0);
  217. } else
  218. return null;
  219. }
  220. /**************************** 数值统计 ******************************************/
  221. /**
  222. * 分组数值统计
  223. *
  224. * @param core 表名
  225. * @param q 查询条件
  226. * @param statsField 统计字段
  227. * @param groupField 分组字段
  228. * @return
  229. */
  230. public List<FieldStatsInfo> getStats(String core, String q, String fq, String statsField, String groupField) throws Exception {
  231. SolrClient conn = pool.getConnection(core);
  232. SolrQuery query = new SolrQuery();
  233. if (null != q && !q.equals("")) //设置查询条件
  234. {
  235. query.setQuery(q);
  236. } else {
  237. query.setQuery("*:*");
  238. }
  239. if (null != fq && !fq.equals("")) //设置过滤条件
  240. {
  241. query.setFilterQueries(fq);
  242. }
  243. query.addGetFieldStatistics(statsField);
  244. query.addStatsFieldFacets(statsField, groupField);
  245. query.setRows(0);
  246. QueryResponse rsp = conn.query(query);
  247. qtime = rsp.getQTime();
  248. System.out.print("Solr Stats Time:" + qtime);
  249. Map<String, FieldStatsInfo> stats = rsp.getFieldStatsInfo();
  250. pool.close(core);
  251. if (stats != null && stats.size() > 0) {
  252. Map<String, List<FieldStatsInfo>> map = stats.get(statsField).getFacets();
  253. if (map != null) {
  254. return map.get(groupField);
  255. }
  256. }
  257. return null;
  258. }
  259. /**
  260. * 查询统计
  261. *
  262. * @param core 表名
  263. * @param facetQuery 查询条件
  264. * @return
  265. * @throws Exception
  266. */
  267. public Map<String, Integer> getFacetQuery(String core, String facetQuery) throws Exception {
  268. SolrClient conn = pool.getConnection(core);
  269. SolrQuery query = new SolrQuery();
  270. query.setQuery("*:*");
  271. query.setFacet(true);
  272. query.addFacetQuery(facetQuery);
  273. QueryResponse resp = conn.query(query);
  274. return resp.getFacetQuery();
  275. }
  276. /**
  277. * 单字段分组统计
  278. *
  279. * @param core
  280. * @param facetField
  281. * @param fq
  282. * @param minCount
  283. * @param start
  284. * @param limit
  285. * @param missing
  286. * @return
  287. * @throws Exception
  288. */
  289. public FacetField getFacetField(String core, String facetField, String fq, int minCount, int start, int limit, boolean missing) throws Exception {
  290. SolrClient conn = pool.getConnection(core);
  291. SolrQuery query = new SolrQuery();
  292. query.setQuery("*:*");
  293. if (!StringUtils.isBlank(fq)) {
  294. query.setFilterQueries(fq);
  295. }
  296. query.setStart(start)
  297. .setRows(0)
  298. .setFacet(true)
  299. .addFacetField(facetField)
  300. .setFacetMinCount(minCount)
  301. .setFacetLimit(limit)
  302. .setFacetMissing(missing);
  303. QueryResponse resp = conn.query(query);
  304. return resp.getFacetField(facetField);
  305. }
  306. /**
  307. * 日期范围分组统计
  308. *
  309. * @param core
  310. * @param dateField
  311. * @param startTime
  312. * @param endTime
  313. * @param grap
  314. * @param fq
  315. * @return
  316. * @throws Exception
  317. */
  318. public List<RangeFacet> getFacetDateRange(String core, String dateField, Date startTime, Date endTime, String grap, String fq) throws Exception {
  319. SolrClient conn = pool.getConnection(core);
  320. SolrQuery query = new SolrQuery();
  321. query.setQuery("*:*");
  322. if (!StringUtils.isBlank(fq)) {
  323. query.setFilterQueries(fq);
  324. }
  325. query.setRows(0)
  326. .setFacet(true)
  327. .addDateRangeFacet(dateField, startTime, endTime, grap);
  328. QueryResponse resp = conn.query(query);
  329. return resp.getFacetRanges();
  330. }
  331. /**
  332. * 数值型字段范围统计
  333. *
  334. * @param core
  335. * @param numField
  336. * @param start
  337. * @param end
  338. * @param grap
  339. * @param fq
  340. * @return
  341. * @throws Exception
  342. */
  343. public List<RangeFacet> getFacetNumRange(String core, String numField, int start, int end, int grap, String fq) throws Exception {
  344. SolrClient conn = pool.getConnection(core);
  345. SolrQuery query = new SolrQuery();
  346. query.setQuery("*:*");
  347. if (!StringUtils.isBlank(fq)) {
  348. query.setFilterQueries(fq);
  349. }
  350. query.setRows(0)
  351. .setFacet(true)
  352. .addNumericRangeFacet(numField, start, end, grap);
  353. QueryResponse resp = conn.query(query);
  354. return resp.getFacetRanges();
  355. }
  356. }