CompletionFieldMapper.java 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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.fieldtype.CompletionContext;
  5. import org.es.mapping.annotations.fieldtype.CompletionField;
  6. import org.es.mapping.utils.BeanUtils;
  7. import java.io.IOException;
  8. import java.lang.reflect.Field;
  9. public class CompletionFieldMapper {
  10. public static boolean isValidCompletionFieldType(Field field) {
  11. if (BeanUtils.isCollectionType(field)) {
  12. if (!BeanUtils.isValidCollectionType(field)) {
  13. throw new IllegalArgumentException(
  14. String.format("Unsupported list class type, name[%s].", field.getName()));
  15. }
  16. Class genericTypeClass = (Class) BeanUtils.getCollectionGenericType(field);
  17. return String.class.isAssignableFrom(genericTypeClass) && field.isAnnotationPresent(CompletionField.class);
  18. }
  19. Class<?> fieldClass = field.getType();
  20. return (String.class == fieldClass) && field.isAnnotationPresent(CompletionField.class);
  21. }
  22. public static void mapDataType(XContentBuilder mappingBuilder, CompletionField completionField) throws IOException {
  23. mappingBuilder.field("type", "completion");
  24. if (!"simple".equalsIgnoreCase(completionField.analyzer())) {
  25. mappingBuilder.field("analyzer", completionField.analyzer());
  26. }
  27. if (!"simple".equalsIgnoreCase(completionField.search_analyzer())) {
  28. mappingBuilder.field("search_analyzer", completionField.search_analyzer());
  29. }
  30. if (!completionField.preserve_separators()) {
  31. mappingBuilder.field("preserve_separators", completionField.preserve_separators());
  32. }
  33. if (!completionField.preserve_position_increments()) {
  34. mappingBuilder.field("preserve_position_increments", completionField.preserve_position_increments());
  35. }
  36. if (completionField.max_input_length() != 50) {
  37. mappingBuilder.field("max_input_length", completionField.max_input_length());
  38. }
  39. if (completionField.contexts().length > 0) {
  40. mappingBuilder.startArray("contexts");
  41. for (CompletionContext completionContext : completionField.contexts()) {
  42. mappingBuilder.field("name", completionContext.name());
  43. mappingBuilder.field("type", completionContext.type());
  44. if (StringUtils.isNotBlank(completionContext.path())) {
  45. mappingBuilder.field("path", completionContext.path());
  46. }
  47. }
  48. mappingBuilder.endArray();
  49. }
  50. }
  51. public static void mapDataType(XContentBuilder mappingBuilder, Field field) throws IOException {
  52. if (!isValidCompletionFieldType(field)) {
  53. throw new IllegalArgumentException(
  54. String.format("field type[%s] is invalid type of string.", field.getType()));
  55. }
  56. CompletionField completionField = field.getDeclaredAnnotation(CompletionField.class);
  57. mapDataType(mappingBuilder, completionField);
  58. }
  59. }