SolrSchemaEndPoint.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package com.yihu.ehr.resource.controller;
  2. import com.yihu.ehr.constants.ApiVersion;
  3. import com.yihu.ehr.resource.model.RsMetadata;
  4. import com.yihu.ehr.resource.service.RsMetadataService;
  5. import io.swagger.annotations.Api;
  6. import io.swagger.annotations.ApiOperation;
  7. import io.swagger.annotations.ApiParam;
  8. import org.apache.solr.client.solrj.SolrClient;
  9. import org.apache.solr.client.solrj.SolrServerException;
  10. import org.apache.solr.client.solrj.request.schema.SchemaRequest;
  11. import org.apache.solr.client.solrj.response.schema.SchemaResponse;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.data.domain.Page;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.RequestMethod;
  16. import org.springframework.web.bind.annotation.RequestParam;
  17. import org.springframework.web.bind.annotation.RestController;
  18. import java.io.IOException;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. /**
  23. * @author Sand
  24. * @created 2016.05.20 14:03
  25. */
  26. @RestController
  27. @RequestMapping(value = ApiVersion.Version1_0)
  28. @Api(value = "SolrSchemaEndPoint", description = "资源数据元与SolrSchema同步", tags = {"资源服务-资源数据元与SolrSchema同步"})
  29. public class SolrSchemaEndPoint {
  30. @Autowired
  31. RsMetadataService metaDataService;
  32. @Autowired
  33. SolrClient solrClient;
  34. @RequestMapping(value = "/rs/solr_schema", method = RequestMethod.GET)
  35. @ApiOperation(value = "导出档案的SolrSchema字段")
  36. public List<Map<String, Object>> exportProfileSolrSchema(
  37. @ApiParam(value = "core", defaultValue = "HealthProfile")
  38. @RequestParam String core) throws IOException, SolrServerException {
  39. SchemaRequest.Fields fieldsRequest = new SchemaRequest.Fields(null);
  40. SchemaResponse.FieldsResponse fieldsResponse = fieldsRequest.process(solrClient, core);
  41. List<Map<String, Object>> fields = fieldsResponse.getFields();
  42. return fields;
  43. }
  44. @RequestMapping(value = "/rs/solr_schema", method = RequestMethod.POST)
  45. @ApiOperation(value = "更新SolrSchema字段", notes = "对比现有的资源数据元与Solr中的Schema字段列表,若不存在则添加")
  46. public void updateSolrSchema(
  47. @ApiParam(value = "core", defaultValue = "HealthProfile")
  48. @RequestParam String core,
  49. @ApiParam(value = "stored", defaultValue = "false")
  50. @RequestParam boolean stored,
  51. @ApiParam(value = "indexed", defaultValue = "true")
  52. @RequestParam boolean indexed) throws IOException, SolrServerException {
  53. Page<RsMetadata> metaDatas = metaDataService.getMetadata("+id", 0, 100000);
  54. for (RsMetadata metaData : metaDatas.getContent()) {
  55. checkFieldExistence(metaData, core, stored, indexed);
  56. }
  57. }
  58. private void checkFieldExistence(RsMetadata metaData, String core, boolean stored, boolean indexed) throws IOException, SolrServerException {
  59. SchemaRequest.Field fieldRequest = new SchemaRequest.Field(metaData.getId());
  60. SchemaResponse.FieldResponse fieldResponse = fieldRequest.process(solrClient, core);
  61. Map<String, Object> fieldAttributes = fieldResponse.getField();
  62. if (fieldAttributes == null) {
  63. fieldAttributes = new HashMap<>();
  64. fieldAttributes.put("name", metaData.getId());
  65. fieldAttributes.put("type", getMetaDataSolrType(metaData.getColumnType()));
  66. fieldAttributes.put("stored", stored);
  67. fieldAttributes.put("indexed", indexed);
  68. SchemaRequest.AddField addFieldRequest = new SchemaRequest.AddField(fieldAttributes);
  69. addFieldRequest.process(solrClient, core);
  70. }
  71. }
  72. private String getMetaDataSolrType(String metaDataType) {
  73. if (metaDataType.startsWith("S")) {
  74. return "text_ansj";
  75. } else if (metaDataType.startsWith("D")) {
  76. return "date";
  77. } else if (metaDataType.startsWith("L")) {
  78. return "string";
  79. } else if (metaDataType.startsWith("N")) {
  80. return "double";
  81. }
  82. return "string";
  83. }
  84. }