StringFieldMapper.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package org.es.mapping.mapper;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.elasticsearch.common.xcontent.XContentBuilder;
  4. import org.es.mapping.annotations.enums.IndexOptions;
  5. import org.es.mapping.annotations.enums.SimilarityAlgorithm;
  6. import org.es.mapping.annotations.enums.StringType;
  7. import org.es.mapping.annotations.enums.TermVector;
  8. import org.es.mapping.annotations.fieldtype.StringField;
  9. import org.es.mapping.utils.BeanUtils;
  10. import java.io.IOException;
  11. import java.lang.reflect.Field;
  12. public class StringFieldMapper {
  13. public static boolean isValidStringFieldType(Field field) {
  14. if (BeanUtils.isCollectionType(field)) {
  15. if (!BeanUtils.isValidCollectionType(field)) {
  16. throw new IllegalArgumentException(
  17. String.format("Unsupported list class type, name[%s].", field.getName()));
  18. }
  19. Class genericTypeClass = (Class) BeanUtils.getCollectionGenericType(field);
  20. return String.class.isAssignableFrom(genericTypeClass);
  21. }
  22. Class<?> fieldClass = field.getType();
  23. return String.class.isAssignableFrom(fieldClass);
  24. }
  25. public static void mapDataType(XContentBuilder mappingBuilder, StringField stringField) throws IOException {
  26. mappingBuilder.field("type", stringField.type().code());
  27. if (stringField.boost() != 1.0f) {
  28. mappingBuilder.field("boost", stringField.boost());
  29. }
  30. if (!stringField.doc_values()) {
  31. mappingBuilder.field("doc_values", stringField.doc_values());
  32. }
  33. if (stringField.copy_to().length > 0) {
  34. if (stringField.copy_to().length == 1) {
  35. mappingBuilder.field("copy_to", stringField.copy_to()[0]);
  36. }
  37. else {
  38. mappingBuilder.array("copy_to", stringField.copy_to());
  39. }
  40. }
  41. if (stringField.eager_global_ordinals()) {
  42. mappingBuilder.field("eager_global_ordinals", stringField.eager_global_ordinals());
  43. }
  44. if (stringField.ignore_above() != 2147483647) {
  45. mappingBuilder.field("ignore_above", stringField.ignore_above());
  46. }
  47. if (!stringField.include_in_all()) {
  48. mappingBuilder.field("include_in_all", stringField.include_in_all());
  49. }
  50. else if (!stringField.index()) {
  51. mappingBuilder.field("include_in_all", false);
  52. }
  53. if (!stringField.index()) {
  54. mappingBuilder.field("index", stringField.index());
  55. }
  56. if (stringField.index_options() != IndexOptions.Default) {
  57. mappingBuilder.field("index_options", stringField.index_options().code());
  58. }
  59. if (StringUtils.isNotBlank(stringField.null_value())) {
  60. mappingBuilder.field("null_value", stringField.null_value());
  61. }
  62. if (stringField.store()) {
  63. mappingBuilder.field("store", stringField.store());
  64. }
  65. if (stringField.similarity() != SimilarityAlgorithm.Default) {
  66. mappingBuilder.field("similarity", stringField.similarity().code());
  67. }
  68. // full text setting
  69. if (stringField.type() == StringType.Text) {
  70. if (StringUtils.isNotBlank(stringField.analyzer())) {
  71. mappingBuilder.field("analyzer", stringField.analyzer());
  72. }
  73. if (StringUtils.isNotBlank(stringField.search_analyzer())) {
  74. mappingBuilder.field("search_analyzer", stringField.search_analyzer());
  75. }
  76. if (StringUtils.isNotBlank(stringField.search_quote_analyzer())) {
  77. mappingBuilder.field("search_quote_analyzer", stringField.search_quote_analyzer());
  78. }
  79. if (stringField.position_increment_gap() != 100) {
  80. mappingBuilder.field("position_increment_gap", stringField.position_increment_gap());
  81. }
  82. if (!stringField.norms()) {
  83. mappingBuilder.field("norms", stringField.norms());
  84. }
  85. if (stringField.term_vector() != TermVector.No) {
  86. mappingBuilder.field("term_vector", stringField.term_vector().code());
  87. }
  88. if (stringField.fielddata().enable() && stringField.type() == StringType.Text) {
  89. mappingBuilder.field("fielddata", stringField.fielddata().enable());
  90. if (stringField.fielddata().frequency().enable()) {
  91. mappingBuilder.startObject("fielddata_frequency_filter");
  92. if (stringField.fielddata().frequency().min() > 0) {
  93. mappingBuilder.field("min", stringField.fielddata().frequency().min());
  94. }
  95. if (stringField.fielddata().frequency().max() > 0) {
  96. mappingBuilder.field("max", stringField.fielddata().frequency().max());
  97. }
  98. if (stringField.fielddata().frequency().min_segment_size() > 0) {
  99. mappingBuilder.field("min_segment_size", stringField.fielddata().frequency().min_segment_size());
  100. }
  101. mappingBuilder.endObject();
  102. }
  103. }
  104. }
  105. }
  106. public static void mapDataType(XContentBuilder mappingBuilder, Field field) throws IOException {
  107. if (!isValidStringFieldType(field)) {
  108. throw new IllegalArgumentException(
  109. String.format("field type[%s] is invalid type of string.", field.getType()));
  110. }
  111. if (field.isAnnotationPresent(StringField.class)) {
  112. StringField stringField = field.getDeclaredAnnotation(StringField.class);
  113. mapDataType(mappingBuilder, stringField);
  114. return;
  115. }
  116. mappingBuilder.field("type", "keyword");
  117. }
  118. }