├── src
└── main
│ ├── resources
│ └── META-INF
│ │ └── spring.factories
│ └── java
│ └── com
│ └── elastic
│ └── search
│ ├── elasticsearch
│ ├── search
│ │ ├── index
│ │ │ ├── AnalyzedType.java
│ │ │ ├── Option.java
│ │ │ ├── TermVector.java
│ │ │ ├── Field.java
│ │ │ ├── DataType.java
│ │ │ ├── IndexStruct.java
│ │ │ └── ScanDocuments.java
│ │ ├── log
│ │ │ └── SearchLogger.java
│ │ ├── api
│ │ │ └── SearchService.java
│ │ └── utils
│ │ │ └── ModifyIndexFactory.java
│ ├── dataobject
│ │ ├── enums
│ │ │ ├── SortEnum.java
│ │ │ ├── OperateTypeEnum.java
│ │ │ ├── SqlFunctionEnum.java
│ │ │ └── ConditionExpressionEnum.java
│ │ ├── ESDocument.java
│ │ ├── BatchDeleteESObject.java
│ │ ├── BatchSaveESObject.java
│ │ ├── ConditionUpdateESObject.java
│ │ ├── conditions
│ │ │ ├── HavingCondition.java
│ │ │ ├── OrderCondition.java
│ │ │ ├── PageCondition.java
│ │ │ ├── FunctionCondition.java
│ │ │ ├── GroupByCondition.java
│ │ │ └── InnerHitsCondition.java
│ │ ├── ConditionDeleteESObject.java
│ │ ├── BatchUpdateESObject.java
│ │ ├── DeleteESObject.java
│ │ ├── BaseESObject.java
│ │ ├── StatisticESObject.java
│ │ ├── ESResponse.java
│ │ ├── UpdateESObject.java
│ │ ├── NestedESObject.java
│ │ ├── SaveESObject.java
│ │ └── CollapseQueryObject.java
│ ├── infrastructure
│ │ ├── constants
│ │ │ └── TypeIndexConstants.java
│ │ ├── annotation
│ │ │ ├── EsObject.java
│ │ │ ├── Cascades.java
│ │ │ └── Cascade.java
│ │ ├── executor
│ │ │ ├── SearchExecutor.java
│ │ │ └── impl
│ │ │ │ ├── BaseSearchTypeIndexModifyExecutor.java
│ │ │ │ └── BaseSearchSaveExecutor.java
│ │ ├── enums
│ │ │ └── FieldTypeEnum.java
│ │ ├── utils
│ │ │ ├── PageConditionUtils.java
│ │ │ └── OrderConditionUtils.java
│ │ ├── consts
│ │ │ └── FrameworkExceptionConstants.java
│ │ ├── handler
│ │ │ ├── ESStatisticResponseHandler.java
│ │ │ └── CollapseResponseHandler.java
│ │ ├── bean
│ │ │ └── Field.java
│ │ └── conf
│ │ │ └── BaseTypeIndexConfiguration.java
│ ├── serialize
│ │ ├── SerializeApi.java
│ │ ├── bytes
│ │ │ ├── SerializeByteApi.java
│ │ │ ├── JDKSerialize.java
│ │ │ └── KryoSerialize.java
│ │ └── api
│ │ │ ├── json
│ │ │ ├── parser
│ │ │ │ ├── LongType.java
│ │ │ │ ├── DateTimeType.java
│ │ │ │ ├── YmdDateType.java
│ │ │ │ ├── GMTDateTimeType.java
│ │ │ │ └── ParserDateFactory.java
│ │ │ ├── SerializeJsonApi.java
│ │ │ ├── GsonSerialize.java
│ │ │ ├── SerializeJsonFactory.java
│ │ │ ├── DateDeserializer.java
│ │ │ └── JacksonSerialize.java
│ │ │ └── xml
│ │ │ ├── SerializeXml.java
│ │ │ └── XStreamAlias.java
│ ├── evo
│ │ ├── ESClient.java
│ │ ├── ESQueryBuilder.java
│ │ ├── ESBoolQueryBuilder.java
│ │ └── ESSearchRequestBuilder.java
│ ├── validator
│ │ ├── ESDeleteValidator.java
│ │ ├── ESQueryValidator.java
│ │ ├── ESUpdateValidator.java
│ │ ├── ESSaveValidator.java
│ │ ├── ESConditionUpdateValidator.java
│ │ ├── ESConditionDeleteValidator.java
│ │ ├── ESBatchDeleteValidator.java
│ │ ├── BaseValidator.java
│ │ ├── ESBatchSaveValidator.java
│ │ ├── ESBatchUpdateValidator.java
│ │ ├── StatisticByConditionsValidator.java
│ │ ├── CollapseQueryValidator.java
│ │ └── BaseUpdateValidator.java
│ ├── condition
│ │ ├── RelationConditionBuilder.java
│ │ ├── CollapseConditionBuilder.java
│ │ ├── QueryConditionBuilder.java
│ │ ├── SearchSourceBuilder.java
│ │ └── GroupConditionBuilder.java
│ ├── searchservice
│ │ ├── ESStatisticService.java
│ │ ├── ESStatisticServiceImpl.java
│ │ └── ESSearchService.java
│ ├── config
│ │ ├── IndexHelper.java
│ │ ├── IndexUtils.java
│ │ ├── IndexAdmin.java
│ │ └── CanalBean.java
│ └── convert
│ │ └── ESSearchConvertor.java
│ ├── common
│ ├── exception
│ │ ├── RpcException.java
│ │ ├── SearchBusinessException.java
│ │ ├── OpenSystemException.java
│ │ ├── ExceptionFactory.java
│ │ ├── SystemException.java
│ │ ├── FrameworkException.java
│ │ ├── BusinessException.java
│ │ ├── ErrorCode.java
│ │ └── StatusDefinition.java
│ ├── utils
│ │ ├── ListUtils.java
│ │ ├── EmptyUtils.java
│ │ └── Ognl.java
│ ├── domain
│ │ ├── GlobalConstant.java
│ │ ├── ESErrorCode.java
│ │ ├── BaseResult.java
│ │ ├── Status.java
│ │ ├── PagedList.java
│ │ └── SystemManager.java
│ └── boot
│ │ └── SearchBeanContext.java
│ ├── starter
│ └── EtcElasticSearchProperties.java
│ └── listener
│ └── SpringBootEnvironmentListener.java
├── .gitignore
└── pom.xml
/src/main/resources/META-INF/spring.factories:
--------------------------------------------------------------------------------
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.elastic.search.starter.ElasticSearchStarter
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/search/index/AnalyzedType.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.search.index;
2 |
3 | public enum AnalyzedType {
4 |
5 | // 分词
6 | ANALYZED,
7 | // 不分词
8 | NOT_ANALYZED,
9 | // 设置成no,字段将不会被索引
10 | NO;
11 | }
12 |
13 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/dataobject/enums/SortEnum.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.dataobject.enums;
2 |
3 | /**
4 | *
5 | * 排序条件枚举
6 | *
7 | * @author niuzhiwei
8 | */
9 | public enum SortEnum {
10 |
11 | ASC(), DESC();
12 |
13 | SortEnum() {
14 | }
15 | }
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/dataobject/enums/OperateTypeEnum.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.dataobject.enums;
2 |
3 | /**
4 | *
5 | * 操作类型 增删改
6 | *
7 | * @author niuzhiwei
8 | */
9 | public enum OperateTypeEnum {
10 | ADD, DELETE, UPDATE;
11 |
12 | OperateTypeEnum() {
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/dataobject/enums/SqlFunctionEnum.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.dataobject.enums;
2 |
3 | /**
4 | *
5 | * es 组合函数
6 | *
7 | * @author niuzhiwei
8 | */
9 | public enum SqlFunctionEnum {
10 | SUM, AVG, MIN, MAX, COUNT;
11 |
12 | SqlFunctionEnum() {
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/infrastructure/constants/TypeIndexConstants.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.infrastructure.constants;
2 |
3 | /**
4 | * @author niuzhiwei
5 | */
6 | public class TypeIndexConstants {
7 | /**
8 | * 系统名
9 | */
10 | public static final String SYSTEM_NAME = "search";
11 | }
12 |
13 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/search/index/Option.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.search.index;
2 |
3 | public enum Option {
4 | // 分词字段默认是position,其他的默认是docs
5 | // 索引文档号
6 | docs,
7 | // 文档号+词频
8 | freqs,
9 | // 文档号+词频+位置,通常用来距离查询
10 | positions,
11 | // 文档号+词频+位置+偏移量,通常被使用在高亮字段
12 | offsets
13 | }
14 |
15 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/infrastructure/annotation/EsObject.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.infrastructure.annotation;
2 |
3 | import java.lang.annotation.*;
4 |
5 |
6 | /**
7 | * @author niuzhiwei
8 | */
9 | @Target(ElementType.FIELD)
10 | @Retention(RetentionPolicy.RUNTIME)
11 | @Documented
12 | public @interface EsObject {
13 | }
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/infrastructure/annotation/Cascades.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.infrastructure.annotation;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * @author niuzhiwei
7 | */
8 | @Target({ElementType.TYPE})
9 | @Retention(RetentionPolicy.RUNTIME)
10 | @Documented
11 | @Inherited
12 | public @interface Cascades {
13 |
14 | Cascade[] value();
15 | }
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/search/index/TermVector.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.search.index;
2 |
3 | public enum TermVector {
4 | // 默认不存储向量信息,
5 | no,
6 | // 支持term存储
7 | yes,
8 | // term+位置
9 | with_positions,
10 | // (term+偏移量)
11 | with_offsets,
12 | // term+位置+偏移量 对快速高亮fast vector
13 | with_positions_offsets,
14 | // highlighter能提升性能,但开启又会加大索引体积,不适合大数据量用
15 |
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/infrastructure/executor/SearchExecutor.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.infrastructure.executor;
2 |
3 |
4 | import com.elastic.search.elasticsearch.infrastructure.conf.BaseTypeIndexConfiguration;
5 |
6 | /**
7 | * @author niuzhiwei
8 | */
9 | public interface SearchExecutor {
10 |
11 | /**
12 | * 获取索引配置
13 | *
14 | * @return
15 | */
16 | BaseTypeIndexConfiguration getConfig();
17 | }
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled class file
2 | *.class
3 |
4 | # Log file
5 | *.log
6 |
7 | # BlueJ files
8 | *.ctxt
9 | *.classpath
10 | *.factorypath
11 | *.project
12 | *.iml
13 |
14 | # Mobile Tools for Java (J2ME)
15 | .mtj.tmp/
16 |
17 | # Package Files #
18 | *.jar
19 | *.war
20 | *.nar
21 | *.ear
22 | *.zip
23 | *.tar.gz
24 | *.rar
25 |
26 |
27 | #失效目录
28 | target/
29 | .settings/
30 | .idea/
31 |
32 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
33 | hs_err_pid*
34 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/common/exception/RpcException.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.common.exception;
2 |
3 | /**
4 | * RPC 调用异常类,例如A服务 调用->B服务时,如果B服务返回消息为非成功状态时,
5 | * 抛出这类异常,这类异常在DataResult中不会增加当前系统的系统编码。
6 | *
7 | * @author niuzhiwei
8 | */
9 | public class RpcException extends SystemException {
10 |
11 | private static final long serialVersionUID = -8747374925065155821L;
12 |
13 | public RpcException(int errorCode, String errorReason) {
14 | super(errorCode, errorReason);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/SerializeApi.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize;
2 |
3 | /**
4 | * @author niuzhiwei
5 | */
6 | public interface SerializeApi {
7 | /**
8 | * 序列化API
9 | *
10 | * @param t
11 | * @return
12 | */
13 | public R encode(Object t);
14 |
15 | /**
16 | * 反序列化API
17 | *
18 | * @param data
19 | * @param type
20 | * @return
21 | */
22 | public T decode(R data, Class type);
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/common/utils/ListUtils.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.common.utils;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * @author niuzhiwei
7 | */
8 | public class ListUtils {
9 |
10 | public ListUtils() {
11 | }
12 |
13 | public static synchronized Boolean isBlank(List> list) {
14 | return null == list || list.size() == 0;
15 | }
16 |
17 | public static synchronized Boolean isNotBlank(List> list) {
18 | return null != list && list.size() != 0;
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/evo/ESClient.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.evo;
2 |
3 | import org.elasticsearch.client.transport.TransportClient;
4 |
5 | import javax.annotation.Resource;
6 |
7 | /**
8 | * @author niuzhiwei
9 | */
10 | public class ESClient {
11 |
12 | @Resource
13 | private TransportClient transportClient;
14 |
15 | public ESSearchRequestBuilder prepareSearch(String index, String type) {
16 | return new ESSearchRequestBuilder(transportClient.prepareSearch(index).setTypes(type));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/validator/ESDeleteValidator.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.validator;
2 |
3 |
4 | import com.elastic.search.common.domain.SearchBaseResult;
5 | import com.elastic.search.elasticsearch.dataobject.DeleteESObject;
6 |
7 | /**
8 | * @author niuzhiwei
9 | */
10 | public class ESDeleteValidator extends BaseValidator {
11 |
12 | public SearchBaseResult validate(DeleteESObject obj) {
13 | final SearchBaseResult baseValidateResult = super.baseValidate(obj);
14 |
15 | return baseValidateResult;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/common/exception/SearchBusinessException.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.common.exception;
2 |
3 | /**
4 | * @author niuzhiwei
5 | */
6 | public class SearchBusinessException extends BusinessException {
7 |
8 | private static final long serialVersionUID = -3460524052435971680L;
9 |
10 | public SearchBusinessException(Throwable t) {
11 | super(t);
12 | }
13 |
14 | public SearchBusinessException(Integer errorCode, String errorMsg) {
15 | super(errorCode, errorMsg);
16 | }
17 |
18 | public SearchBusinessException(Integer errorCode, String errorMsg, Throwable cause) {
19 | super(errorCode, errorMsg, cause);
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/common/exception/OpenSystemException.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.common.exception;
2 |
3 |
4 |
5 | /**
6 | * @author niuzhiwei
7 | */
8 | public class OpenSystemException extends SystemException {
9 |
10 | private static final long serialVersionUID = -427919774313417519L;
11 |
12 | public OpenSystemException(int errorCode, String desc) {
13 | super(errorCode, desc);
14 | }
15 |
16 | public OpenSystemException(ErrorCode errorCode) {
17 | this(errorCode.getErrorCode(), errorCode.getErrorReason());
18 | }
19 |
20 | @Override
21 | public String getMessage() {
22 | return getErrorCode() + "-" + getErrorReason();
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/infrastructure/annotation/Cascade.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.infrastructure.annotation;
2 |
3 | import java.lang.annotation.*;
4 |
5 |
6 | /**
7 | * 关联模糊查询需要用到此注解
8 | *
9 | * @author niuzhiwei
10 | */
11 | @Target(ElementType.TYPE)
12 | @Retention(RetentionPolicy.RUNTIME)
13 | @Documented
14 | @Inherited
15 | @Repeatable(Cascades.class)
16 | public @interface Cascade {
17 | /**
18 | * 关联字段名称
19 | *
20 | * @return
21 | * @Author
22 | */
23 | String value() default "";
24 |
25 | /**
26 | * 关联字段名称
27 | *
28 | * @return
29 | * @Author
30 | */
31 | String[] fields() default {};
32 | }
33 |
34 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/starter/EtcElasticSearchProperties.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.starter;
2 |
3 |
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import lombok.ToString;
7 | import org.springframework.boot.context.properties.ConfigurationProperties;
8 |
9 | /**
10 | * ES配置
11 | *
12 | * @author niuzhiwei
13 | */
14 | @Getter
15 | @Setter
16 | @ToString
17 | @ConfigurationProperties(prefix = "search.es")
18 | public class EtcElasticSearchProperties {
19 |
20 | /**
21 | * es地址
22 | */
23 | private String host;
24 |
25 | /**
26 | * es端口
27 | */
28 | private Integer port;
29 |
30 | /**
31 | * 集群名称
32 | */
33 | private String clusterName;
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/bytes/SerializeByteApi.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize.bytes;
2 |
3 | import com.elastic.search.elasticsearch.serialize.SerializeApi;
4 |
5 | /**
6 | * 序列化POJO->Byte->POJO类型API
7 | *
8 | * @author SHOUSHEN LUAN
9 | */
10 | public interface SerializeByteApi extends SerializeApi {
11 |
12 | /**
13 | * 编码
14 | *
15 | * @param t
16 | * @return
17 | */
18 | @Override
19 | public byte[] encode(Object t);
20 |
21 | /**
22 | * 解码
23 | *
24 | * @param data
25 | * @param type
26 | * @param
27 | * @return
28 | */
29 | @Override
30 | public T decode(byte[] data, Class type);
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/api/json/parser/LongType.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize.api.json.parser;
2 |
3 |
4 | import java.util.Date;
5 |
6 | /**
7 | * @author niuzhiwei
8 | */
9 | public class LongType implements ParserDateFactory.DateType {
10 | @Override
11 | public boolean matches(String value) {
12 | if (value != null) {
13 | try {
14 | Long.parseLong(value.trim());
15 | return true;
16 | } catch (Exception e) {
17 | }
18 | }
19 | return false;
20 | }
21 |
22 | @Override
23 | public Date parse(String value) {
24 | return new Date(Long.parseLong(value.trim()));
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/search/log/SearchLogger.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.search.log;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 |
5 | /**
6 | * @author niuzhiwei
7 | */
8 | @Slf4j
9 | public class SearchLogger {
10 |
11 | public static void error(String msg, Exception ex) {
12 | log.error(msg, ex);
13 | }
14 |
15 | public static void log(Object obj) {
16 | if (log.isDebugEnabled()) {
17 | log.debug(obj.toString().replace("\n", " ").replace("\t", " "));
18 | }
19 | }
20 |
21 | public static void log(String msg) {
22 | if (log.isDebugEnabled()) {
23 | log.debug(msg.replace("\n", " ").replace("\t", " "));
24 | }
25 | }
26 |
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/api/json/SerializeJsonApi.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize.api.json;
2 |
3 | import com.elastic.search.elasticsearch.serialize.SerializeApi;
4 | import org.slf4j.Logger;
5 | import org.slf4j.LoggerFactory;
6 |
7 | /**
8 | * @author niuzhiwei
9 | */
10 | public interface SerializeJsonApi extends SerializeApi {
11 |
12 | public static final Logger LOGGER = LoggerFactory.getLogger(SerializeApi.class);
13 |
14 | /**
15 | * 序列化
16 | */
17 | @Override
18 | public String encode(Object t);
19 |
20 | /**
21 | * 反序列化
22 | */
23 | @Override
24 | public T decode(String json, Class type);
25 |
26 | public SerializeJsonApi getInstance();
27 | }
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/infrastructure/enums/FieldTypeEnum.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.infrastructure.enums;
2 |
3 | /**
4 | * @author niuzhiwei
5 | */
6 |
7 | public enum FieldTypeEnum {
8 |
9 | /**
10 | * 字段类型
11 | */
12 | STRING("string"),
13 | INTEGER("integer"),
14 | LONG("long"),
15 | SHORT("short"),
16 | BYTE("byte"),
17 | DOUBLE("double"),
18 | BIG_DECIMAL("double"),
19 | FLOAT("float");
20 |
21 | String type;
22 |
23 | private FieldTypeEnum(String type) {
24 | this.type = type;
25 | }
26 |
27 | public String getType() {
28 | return this.type;
29 | }
30 |
31 | public void setType(String type) {
32 | this.type = type;
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/api/json/GsonSerialize.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize.api.json;
2 |
3 | import com.google.gson.Gson;
4 |
5 | /**
6 | * @author niuzhiwei
7 | */
8 | public class GsonSerialize implements SerializeJsonApi {
9 |
10 | public static GsonSerialize INSTANCE = new GsonSerialize();
11 |
12 | private static Gson gson = new Gson();
13 |
14 | @Override
15 | public String encode(Object t) {
16 | return gson.toJson(t);
17 | }
18 |
19 | @Override
20 | public T decode(String json, Class clazz) {
21 | return (T) gson.fromJson(json, clazz);
22 | }
23 |
24 | @Override
25 | public SerializeJsonApi getInstance() {
26 | return INSTANCE;
27 | }
28 | }
29 |
30 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/api/json/parser/DateTimeType.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize.api.json.parser;
2 |
3 |
4 | import java.text.ParseException;
5 | import java.text.SimpleDateFormat;
6 | import java.util.Date;
7 |
8 | /**
9 | * @author niuzhiwei
10 | */
11 | public class DateTimeType implements ParserDateFactory.DateType {
12 |
13 | @Override
14 | public boolean matches(String value) {
15 | if (value != null) {
16 | return value.length() >= "yyyy-MM-dd HH:mm:ss".length();
17 | }
18 | return false;
19 | }
20 |
21 | @Override
22 | public Date parse(String value) throws ParseException {
23 | return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/api/json/parser/YmdDateType.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize.api.json.parser;
2 |
3 | import java.text.ParseException;
4 | import java.text.SimpleDateFormat;
5 | import java.util.Date;
6 |
7 | /**
8 | * @author niuzhiwei
9 | */
10 | public class YmdDateType implements ParserDateFactory.DateType {
11 |
12 | @Override
13 | public boolean matches(String value) {
14 | if (value != null) {
15 | if (value.length() == "yyyy-MM-dd".length()) {
16 | return true;
17 | }
18 | }
19 | return false;
20 | }
21 |
22 | @Override
23 | public Date parse(String value) throws ParseException {
24 | return new SimpleDateFormat("yyyy-MM-dd").parse(value);
25 | }
26 | }
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/serialize/api/json/parser/GMTDateTimeType.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.serialize.api.json.parser;
2 |
3 |
4 |
5 | import java.text.ParseException;
6 | import java.text.SimpleDateFormat;
7 | import java.util.Date;
8 |
9 | /**
10 | * @author niuzhiwei
11 | */
12 | public class GMTDateTimeType implements ParserDateFactory.DateType {
13 |
14 | @Override
15 | public boolean matches(String value) {
16 | if (value != null) {
17 | if (value.contains("T")) {
18 | return true;
19 | }
20 | }
21 | return false;
22 | }
23 |
24 | @Override
25 | public Date parse(String value) throws ParseException {
26 | return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").parse(value);
27 | }
28 | }
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/common/utils/EmptyUtils.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.common.utils;
2 |
3 | import java.util.List;
4 | import java.util.Map;
5 |
6 | /**
7 | * @author niuzhiwei
8 | */
9 | public class EmptyUtils {
10 |
11 | public static boolean isEmpty(Object s) {
12 | if (s == null) {
13 | return true;
14 | }
15 | if ((s instanceof String) && (((String) s).trim().length() == 0)) {
16 | return true;
17 | }
18 | if (s instanceof Map) {
19 | return ((Map, ?>) s).isEmpty();
20 | }
21 | if (s instanceof List) {
22 | return ((List>) s).isEmpty();
23 | }
24 | if (s instanceof Object[]) {
25 | return (((Object[]) s).length == 0);
26 | }
27 | return false;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/infrastructure/utils/PageConditionUtils.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.infrastructure.utils;
2 |
3 |
4 | import com.elastic.search.elasticsearch.dataobject.conditions.PageCondition;
5 |
6 | /**
7 | *
8 | * 分页工具类
9 | *
10 | * @author niuzhiwei
11 | */
12 | public class PageConditionUtils {
13 |
14 | private PageConditionUtils() {
15 |
16 | }
17 |
18 | /**
19 | * 创建分页条件
20 | *
21 | * @param pageSize
22 | * @param currentPage
23 | * @return
24 | */
25 | public static PageCondition create(int pageSize, int currentPage) {
26 | PageCondition pageCondition = new PageCondition();
27 | pageCondition.setCurrentPage(currentPage);
28 | pageCondition.setPageSize(pageSize);
29 | return pageCondition;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/condition/RelationConditionBuilder.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.condition;
2 |
3 | import org.elasticsearch.index.query.BoolQueryBuilder;
4 | import org.elasticsearch.index.query.QueryBuilder;
5 | import org.springframework.stereotype.Component;
6 |
7 | /**
8 | *
9 | * 检索条件关系 构建器
10 | * @author jack
11 | */
12 | public class RelationConditionBuilder {
13 |
14 | /**
15 | * 构建 根查询 与 当前查询 的嵌套关系
16 | *
17 | * 若有条件分组查询(OR 链接),那么所有关系均为 should ;否则为must
18 | *
19 | * @param groupCondition 是否条件分组
20 | * @param currentQuery 当前查询
21 | * @param rootQuery 根查询
22 | * @return 根查询
23 | */
24 | public QueryBuilder builder(boolean groupCondition, QueryBuilder currentQuery, BoolQueryBuilder rootQuery) {
25 | return groupCondition ? rootQuery.should(currentQuery) : rootQuery.must(currentQuery);
26 | }
27 | }
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/evo/ESQueryBuilder.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.evo;
2 |
3 | import org.elasticsearch.index.query.QueryBuilder;
4 | import org.elasticsearch.index.query.QueryBuilders;
5 |
6 | public class ESQueryBuilder {
7 |
8 | private QueryBuilder queryBuilder;
9 |
10 | public ESQueryBuilder(QueryBuilder queryBuilder) {
11 | this.queryBuilder = queryBuilder;
12 | }
13 |
14 | public static ESQueryBuilder match(String name, Object value) {
15 | QueryBuilder builder = QueryBuilders.matchQuery(name, value);
16 | return new ESQueryBuilder(builder);
17 | }
18 |
19 | public static ESQueryBuilder lt(String name, Object value) {
20 | QueryBuilder builder = QueryBuilders.rangeQuery(name).lt(value);
21 | return new ESQueryBuilder(builder);
22 | }
23 |
24 | public QueryBuilder getQueryBuilder() {
25 | return queryBuilder;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/dataobject/enums/ConditionExpressionEnum.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.dataobject.enums;
2 |
3 | import lombok.Getter;
4 |
5 | /**
6 | *
7 | * es 查询条件表达式
8 | *
9 | * @author niuzhiwei
10 | */
11 | @Getter
12 | public enum ConditionExpressionEnum {
13 | /**
14 | * 查询条件表达式枚举
15 | */
16 | EQUAL("等于"),
17 | UNEQUAL("不等"),
18 | GREATER("大于"),
19 | GREATER_OR_EQUAL("大于等于"),
20 | LESSER("小于"),
21 | LESSER_OR_EQUAL("小于等于"),
22 | LIKE("模糊查询"),
23 | NULL("空值"),
24 | NOT_NULL("非空"),
25 | IN("在"),
26 | NOT_IN("不在"),
27 | BETWEEN("不包含边界值"),
28 | BETWEEN_AND("包含边界值"),
29 | BETWEEN_LEFT("含左不含右"),
30 | BETWEEN_RIGHR("含右不含左"),
31 | MATCH("匹配查询,主要用于分词字段的全文检索");
32 |
33 | /**
34 | * 描述
35 | */
36 |
37 | private String desc;
38 |
39 | ConditionExpressionEnum(String desc) {
40 | this.desc = desc;
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/evo/ESBoolQueryBuilder.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.evo;
2 |
3 | import org.elasticsearch.index.query.BoolQueryBuilder;
4 | import org.elasticsearch.index.query.QueryBuilder;
5 |
6 | /**
7 | * @author niuzhiwei
8 | */
9 | public class ESBoolQueryBuilder {
10 |
11 | private BoolQueryBuilder boolQueryBuilder;
12 |
13 | public ESBoolQueryBuilder(BoolQueryBuilder boolQueryBuilder) {
14 | this.boolQueryBuilder = boolQueryBuilder;
15 | }
16 |
17 | public void must(QueryBuilder builder) {
18 | this.boolQueryBuilder.must(builder);
19 | }
20 |
21 | public void should(QueryBuilder builder) {
22 | this.boolQueryBuilder.should(builder);
23 | }
24 |
25 | public void mustNot(QueryBuilder builder) {
26 | this.boolQueryBuilder.mustNot(builder);
27 | }
28 |
29 | public BoolQueryBuilder getBoolQueryBuilder() {
30 | return boolQueryBuilder;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/search/index/Field.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.search.index;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | public class Field {
7 | Map keyword = new HashMap<>();
8 |
9 | public static Field make() {
10 | return new Field();
11 | }
12 |
13 | public Field setType(DataType type) {
14 | keyword.put("type", type.name().toLowerCase());
15 | return this;
16 | }
17 |
18 | /**
19 | * 忽略字符长度ignore_above以外的字符,不被索引
20 | *
21 | * @param ignore_above
22 | * @return
23 | */
24 | public Field setIgnoreAbove(int ignore_above) {
25 | keyword.put("ignore_above", ignore_above);
26 | return this;
27 | }
28 |
29 | /**
30 | * 超过256个字符的文本,将会被忽略,不被索引
31 | *
32 | * @return
33 | */
34 | public Field setIgnoreAbove() {
35 | keyword.put("ignore_above", 256);
36 | return this;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/search/index/DataType.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.search.index;
2 |
3 | /**
4 | * elasticsearch 数据类型
5 | * https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
6 | *
7 | * @author jack
8 | */
9 | public enum DataType {
10 |
11 | TEXT, KEYWORD,
12 | //
13 | DATE, IP, BOOLEAN,
14 | // number类型
15 | LONG, INTEGER, SHORT, BYTE, DOUBLE, FLOAT,
16 | // nested object mapping
17 | NESTED;
18 |
19 | // {
20 | // "mappings": {
21 | // "blogpost": {
22 | // "properties": {
23 | // "comments": {
24 | // "type": "nested",
25 | // "properties": {
26 | // "name": { "type": "string" },
27 | // "comment": { "type": "string" },
28 | // "age": { "type": "short" },
29 | // "stars": { "type": "short" },
30 | // "date": { "type": "date" }
31 | // }
32 | // }
33 | // }
34 | // }
35 | // }
36 | // }
37 | }
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/validator/ESQueryValidator.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.validator;
2 |
3 |
4 | import com.elastic.search.common.domain.SearchBaseResult;
5 | import com.elastic.search.elasticsearch.dataobject.QueryESObject;
6 | import lombok.extern.slf4j.Slf4j;
7 | import org.slf4j.Logger;
8 | import org.slf4j.LoggerFactory;
9 |
10 | import javax.annotation.Resource;
11 |
12 | @Slf4j
13 | public class ESQueryValidator extends BaseValidator {
14 |
15 | @Resource
16 | private SearchConditionValidator searchConditionValidator;
17 |
18 | private static final Logger LOGGER = LoggerFactory.getLogger(ESQueryValidator.class);
19 |
20 | public SearchBaseResult validate(QueryESObject obj) {
21 | final SearchBaseResult baseValidateResult = super.baseValidate(obj);
22 | if (baseValidateResult.isFailed()) {
23 | return baseValidateResult;
24 | }
25 | return searchConditionValidator
26 | .validator(obj.getSearchConditions());
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/common/exception/ExceptionFactory.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.common.exception;
2 |
3 | /**
4 | * @author niuzhiwei
5 | */
6 | public class ExceptionFactory {
7 |
8 | public ExceptionFactory() {
9 | }
10 |
11 | public static synchronized SearchBusinessException ex(Throwable throwable) {
12 | return new SearchBusinessException(throwable);
13 | }
14 |
15 | public static synchronized SearchBusinessException ex(Integer errorCode, String errorMsg) {
16 | return new SearchBusinessException(errorCode, errorMsg);
17 | }
18 |
19 | public static synchronized SearchBusinessException ex(Integer errorCode, String errorMsg, Object... regex) {
20 | return new SearchBusinessException(errorCode, String.format(errorMsg, regex));
21 | }
22 |
23 | public static synchronized SearchBusinessException ex(Integer errorCode, Throwable throwable, String errorMsg, Object... regex) {
24 | return new SearchBusinessException(errorCode, String.format(errorMsg, regex), throwable);
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/com/elastic/search/elasticsearch/searchservice/ESStatisticService.java:
--------------------------------------------------------------------------------
1 | package com.elastic.search.elasticsearch.searchservice;
2 |
3 |
4 | import com.elastic.search.common.domain.SearchBaseResult;
5 | import com.elastic.search.elasticsearch.dataobject.CollapseQueryObject;
6 | import com.elastic.search.elasticsearch.dataobject.ESResponse;
7 | import com.elastic.search.elasticsearch.dataobject.StatisticESObject;
8 |
9 | import java.util.Map;
10 |
11 | /**
12 | *
13 | * ES 统计相关服务
14 | * @author niuzhiwei
15 | */
16 | public interface ESStatisticService {
17 |
18 | /**
19 | * 全局统计服务,不受分页效果影响
20 | *
21 | * @param esObject ES 统计请求参数
22 | * @return key:functionName;value:statistic value
23 | */
24 | SearchBaseResult