mirror of
https://gitee.com/dromara/easy-es.git
synced 2025-12-06 17:18:57 +08:00
v2.0-beta1
全部细节优化
This commit is contained in:
parent
01a50faa8f
commit
2a855e225c
@ -92,19 +92,19 @@ public enum EsQueryTypeEnum {
|
|||||||
/**
|
/**
|
||||||
* 与条件,相当于MYSQL中的AND,必须满足且返回得分
|
* 与条件,相当于MYSQL中的AND,必须满足且返回得分
|
||||||
*/
|
*/
|
||||||
AND_MUST,
|
NESTED_AND,
|
||||||
/**
|
/**
|
||||||
* 取反的与条件,必须不满足
|
* 取反的与条件,必须不满足
|
||||||
*/
|
*/
|
||||||
MUST_NOT,
|
NESTED_NOT,
|
||||||
/**
|
/**
|
||||||
* 与条件必须满足,但不返回得分,效率更高
|
* 与条件必须满足,但不返回得分,效率更高
|
||||||
*/
|
*/
|
||||||
AND_FILTER,
|
NESTED_FILTER,
|
||||||
/**
|
/**
|
||||||
* 或条件,相当于MYSQL中的OR 和MP中的or嵌套用法一致
|
* 或条件,相当于MYSQL中的OR 和MP中的or嵌套用法一致
|
||||||
*/
|
*/
|
||||||
OR_SHOULD,
|
NESTED_OR,
|
||||||
/**
|
/**
|
||||||
* 嵌套查询 ES独有 对嵌套类型的查询
|
* 嵌套查询 ES独有 对嵌套类型的查询
|
||||||
*/
|
*/
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,7 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
* 设置索引名称
|
* 设置索引名称
|
||||||
*
|
*
|
||||||
* @param indexNames 索引名称
|
* @param indexNames 索引名称
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children indexName(String... indexNames);
|
Children indexName(String... indexNames);
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
* 设置最大返回数
|
* 设置最大返回数
|
||||||
*
|
*
|
||||||
* @param maxResultWindow 最大返回数
|
* @param maxResultWindow 最大返回数
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children maxResultWindow(Integer maxResultWindow);
|
Children maxResultWindow(Integer maxResultWindow);
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
*
|
*
|
||||||
* @param shards 分片数
|
* @param shards 分片数
|
||||||
* @param replicas 副本数
|
* @param replicas 副本数
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children settings(Integer shards, Integer replicas);
|
Children settings(Integer shards, Integer replicas);
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
* 用户手动指定的settings
|
* 用户手动指定的settings
|
||||||
*
|
*
|
||||||
* @param settings settings
|
* @param settings settings
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children settings(Settings settings);
|
Children settings(Settings settings);
|
||||||
|
|
||||||
@ -50,39 +50,107 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
* 用户自行指定mapping
|
* 用户自行指定mapping
|
||||||
*
|
*
|
||||||
* @param mapping mapping信息
|
* @param mapping mapping信息
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children mapping(Map<String, Object> mapping);
|
Children mapping(Map<String, Object> mapping);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param fieldType es中的索引类型
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType) {
|
default Children mapping(R column, FieldType fieldType) {
|
||||||
return mapping(column, fieldType, null, null, null, null, null);
|
return mapping(column, fieldType, null, null, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param fieldData 是否支持text字段聚合
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, Boolean fieldData) {
|
default Children mapping(R column, FieldType fieldType, Boolean fieldData) {
|
||||||
return mapping(column, fieldType, null, null, null, fieldData, null);
|
return mapping(column, fieldType, null, null, null, fieldData, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param boost 权重
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, Float boost) {
|
default Children mapping(R column, FieldType fieldType, Float boost) {
|
||||||
return mapping(column, fieldType, null, null, null, null, boost);
|
return mapping(column, fieldType, null, null, null, null, boost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param fieldData 是否支持text字段聚合
|
||||||
|
* @param boost 权重
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, Boolean fieldData, Float boost) {
|
default Children mapping(R column, FieldType fieldType, Boolean fieldData, Float boost) {
|
||||||
return mapping(column, fieldType, null, null, null, fieldData, boost);
|
return mapping(column, fieldType, null, null, null, fieldData, boost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param dateFormat 日期格式
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, String dateFormat) {
|
default Children mapping(R column, FieldType fieldType, String dateFormat) {
|
||||||
return mapping(column, fieldType, null, null, dateFormat, null, null);
|
return mapping(column, fieldType, null, null, dateFormat, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param analyzer 索引分词器
|
||||||
|
* @param searchAnalyzer 查询分词器
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer) {
|
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer) {
|
||||||
return mapping(column, fieldType, analyzer, searchAnalyzer, null, null, null);
|
return mapping(column, fieldType, analyzer, searchAnalyzer, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param analyzer 索引分词器
|
||||||
|
* @param searchAnalyzer 查询分词器
|
||||||
|
* @param dateFormat 日期格式
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer, String dateFormat) {
|
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer, String dateFormat) {
|
||||||
return mapping(column, fieldType, analyzer, searchAnalyzer, dateFormat, null, null);
|
return mapping(column, fieldType, analyzer, searchAnalyzer, dateFormat, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param analyzer 索引分词器
|
||||||
|
* @param searchAnalyzer 查询分词器
|
||||||
|
* @param boost 权重
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer, Float boost) {
|
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer, Float boost) {
|
||||||
return mapping(column, fieldType, analyzer, searchAnalyzer, null, null, boost);
|
return mapping(column, fieldType, analyzer, searchAnalyzer, null, null, boost);
|
||||||
}
|
}
|
||||||
@ -97,38 +165,97 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
* @param dateFormat 日期格式
|
* @param dateFormat 日期格式
|
||||||
* @param fieldData 是否支持text字段聚合
|
* @param fieldData 是否支持text字段聚合
|
||||||
* @param boost 权重值
|
* @param boost 权重值
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer, String dateFormat, Boolean fieldData, Float boost) {
|
default Children mapping(R column, FieldType fieldType, String analyzer, String searchAnalyzer, String dateFormat, Boolean fieldData, Float boost) {
|
||||||
return mapping(FieldUtils.getFieldName(column), fieldType, analyzer, searchAnalyzer, dateFormat, fieldData, boost);
|
return mapping(FieldUtils.getFieldName(column), fieldType, analyzer, searchAnalyzer, dateFormat, fieldData, boost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(String column, FieldType fieldType) {
|
default Children mapping(String column, FieldType fieldType) {
|
||||||
return mapping(column, fieldType, null, null, null);
|
return mapping(column, fieldType, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param fieldData 是否支持text字段聚合
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(String column, FieldType fieldType, Boolean fieldData) {
|
default Children mapping(String column, FieldType fieldType, Boolean fieldData) {
|
||||||
return mapping(column, fieldType, null, null, fieldData, null);
|
return mapping(column, fieldType, null, null, fieldData, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param boost 权重
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(String column, FieldType fieldType, Float boost) {
|
default Children mapping(String column, FieldType fieldType, Float boost) {
|
||||||
return mapping(column, fieldType, null, null, null, boost);
|
return mapping(column, fieldType, null, null, null, boost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param analyzer 索引分词器
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(String column, FieldType fieldType, String analyzer) {
|
default Children mapping(String column, FieldType fieldType, String analyzer) {
|
||||||
return mapping(column, fieldType, analyzer, null, null);
|
return mapping(column, fieldType, analyzer, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param analyzer 索引分词器
|
||||||
|
* @param searchAnalyzer 查询分词器
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer) {
|
default Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer) {
|
||||||
return mapping(column, fieldType, analyzer, searchAnalyzer, null);
|
return mapping(column, fieldType, analyzer, searchAnalyzer, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param analyzer 索引分词器
|
||||||
|
* @param searchAnalyzer 查询分词器
|
||||||
|
* @param fieldData 是否支持text字段聚合
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer, Boolean fieldData) {
|
default Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer, Boolean fieldData) {
|
||||||
return mapping(column, fieldType, analyzer, searchAnalyzer, fieldData, null);
|
return mapping(column, fieldType, analyzer, searchAnalyzer, fieldData, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置mapping信息
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param fieldType es中的类型
|
||||||
|
* @param analyzer 索引分词器类型
|
||||||
|
* @param searchAnalyzer 查询分词器类型
|
||||||
|
* @param fieldData 是否支持text字段聚合
|
||||||
|
* @param boost 权重
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer, Boolean fieldData, Float boost) {
|
default Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer, Boolean fieldData, Float boost) {
|
||||||
return mapping(column, fieldType, analyzer, searchAnalyzer, null, fieldData, boost);
|
return mapping(column, fieldType, analyzer, searchAnalyzer, null, fieldData, boost);
|
||||||
}
|
}
|
||||||
@ -137,14 +264,14 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
/**
|
/**
|
||||||
* 设置mapping信息
|
* 设置mapping信息
|
||||||
*
|
*
|
||||||
* @param column 列名
|
* @param column 列名 字符串
|
||||||
* @param fieldType es中的类型
|
* @param fieldType es中的类型
|
||||||
* @param analyzer 分词器类型
|
* @param analyzer 索引分词器类型
|
||||||
* @param searchAnalyzer 查询分词器类型
|
* @param searchAnalyzer 查询分词器类型
|
||||||
* @param dateFormat 日期格式
|
* @param dateFormat 日期格式
|
||||||
* @param fieldData 是否支持text字段聚合
|
* @param fieldData 是否支持text字段聚合
|
||||||
* @param boost 字段权重值
|
* @param boost 字段权重值
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer, String dateFormat, Boolean fieldData, Float boost);
|
Children mapping(String column, FieldType fieldType, String analyzer, String searchAnalyzer, String dateFormat, Boolean fieldData, Float boost);
|
||||||
|
|
||||||
@ -152,11 +279,18 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
* 设置创建别名信息
|
* 设置创建别名信息
|
||||||
*
|
*
|
||||||
* @param aliasName 别名
|
* @param aliasName 别名
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children createAlias(String aliasName);
|
Children createAlias(String aliasName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置父子类型信息
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param parentName 父名称
|
||||||
|
* @param childName 子名称
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children join(R column, String parentName, String childName) {
|
default Children join(R column, String parentName, String childName) {
|
||||||
return join(FieldUtils.getFieldName(childName), parentName, childName);
|
return join(FieldUtils.getFieldName(childName), parentName, childName);
|
||||||
}
|
}
|
||||||
@ -164,10 +298,10 @@ public interface Index<Children, R> extends Serializable {
|
|||||||
/**
|
/**
|
||||||
* 设置父子类型信息
|
* 设置父子类型信息
|
||||||
*
|
*
|
||||||
* @param column 列名
|
* @param column 列名 字符串
|
||||||
* @param parentName 父名称
|
* @param parentName 父名称
|
||||||
* @param childName 子名称
|
* @param childName 子名称
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children join(String column, String parentName, String childName);
|
Children join(String column, String parentName, String childName);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ public interface Join<Children> extends Serializable {
|
|||||||
/**
|
/**
|
||||||
* 拼接filter
|
* 拼接filter
|
||||||
*
|
*
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
default Children filter() {
|
default Children filter() {
|
||||||
return filter(true);
|
return filter(true);
|
||||||
@ -20,15 +20,15 @@ public interface Join<Children> extends Serializable {
|
|||||||
/**
|
/**
|
||||||
* 拼接filter
|
* 拼接filter
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 执行条件
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children filter(boolean condition);
|
Children filter(boolean condition);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 拼接or
|
* 拼接or
|
||||||
*
|
*
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
default Children or() {
|
default Children or() {
|
||||||
return or(true);
|
return or(true);
|
||||||
@ -37,15 +37,15 @@ public interface Join<Children> extends Serializable {
|
|||||||
/**
|
/**
|
||||||
* 拼接 OR
|
* 拼接 OR
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 执行条件
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children or(boolean condition);
|
Children or(boolean condition);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 拼接not
|
* 拼接not
|
||||||
*
|
*
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
default Children not() {
|
default Children not() {
|
||||||
return not(true);
|
return not(true);
|
||||||
@ -54,8 +54,8 @@ public interface Join<Children> extends Serializable {
|
|||||||
/**
|
/**
|
||||||
* 拼接not
|
* 拼接not
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 执行条件
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children not(boolean condition);
|
Children not(boolean condition);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,12 @@ import java.util.function.Consumer;
|
|||||||
* Copyright © 2021 xpc1024 All Rights Reserved
|
* Copyright © 2021 xpc1024 All Rights Reserved
|
||||||
**/
|
**/
|
||||||
public interface Nested<Param, Children> extends Serializable {
|
public interface Nested<Param, Children> extends Serializable {
|
||||||
|
/**
|
||||||
|
* AND 嵌套 保留mp用户习惯
|
||||||
|
*
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children and(Consumer<Param> consumer) {
|
default Children and(Consumer<Param> consumer) {
|
||||||
return and(true, consumer);
|
return and(true, consumer);
|
||||||
}
|
}
|
||||||
@ -19,11 +25,17 @@ public interface Nested<Param, Children> extends Serializable {
|
|||||||
* AND 嵌套 保留mp用户习惯
|
* AND 嵌套 保留mp用户习惯
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 条件
|
||||||
* @param consumer 条件函数
|
* @param consumer 嵌套条件函数
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children and(boolean condition, Consumer<Param> consumer);
|
Children and(boolean condition, Consumer<Param> consumer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OR 嵌套 保留mp用户习惯
|
||||||
|
*
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children or(Consumer<Param> consumer) {
|
default Children or(Consumer<Param> consumer) {
|
||||||
return or(true, consumer);
|
return or(true, consumer);
|
||||||
}
|
}
|
||||||
@ -32,11 +44,17 @@ public interface Nested<Param, Children> extends Serializable {
|
|||||||
* OR 嵌套 保留mp用户习惯
|
* OR 嵌套 保留mp用户习惯
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 条件
|
||||||
* @param consumer 条件函数
|
* @param consumer 嵌套条件函数
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children or(boolean condition, Consumer<Param> consumer);
|
Children or(boolean condition, Consumer<Param> consumer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* must 嵌套 等价于and
|
||||||
|
*
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children must(Consumer<Param> consumer) {
|
default Children must(Consumer<Param> consumer) {
|
||||||
return must(true, consumer);
|
return must(true, consumer);
|
||||||
}
|
}
|
||||||
@ -45,12 +63,17 @@ public interface Nested<Param, Children> extends Serializable {
|
|||||||
* must 嵌套 等价于and
|
* must 嵌套 等价于and
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 条件
|
||||||
* @param consumer 条件函数
|
* @param consumer 嵌套条件函数
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children must(boolean condition, Consumer<Param> consumer);
|
Children must(boolean condition, Consumer<Param> consumer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* should 嵌套 等价于or
|
||||||
|
*
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children should(Consumer<Param> consumer) {
|
default Children should(Consumer<Param> consumer) {
|
||||||
return should(true, consumer);
|
return should(true, consumer);
|
||||||
}
|
}
|
||||||
@ -59,11 +82,17 @@ public interface Nested<Param, Children> extends Serializable {
|
|||||||
* should 嵌套 等价于or
|
* should 嵌套 等价于or
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 条件
|
||||||
* @param consumer 条件函数
|
* @param consumer 嵌套条件函数
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children should(boolean condition, Consumer<Param> consumer);
|
Children should(boolean condition, Consumer<Param> consumer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* filter 嵌套 和and及must功能基本一致,但filter不返回得分,效率更高
|
||||||
|
*
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children filter(Consumer<Param> consumer) {
|
default Children filter(Consumer<Param> consumer) {
|
||||||
return filter(true, consumer);
|
return filter(true, consumer);
|
||||||
}
|
}
|
||||||
@ -77,40 +106,66 @@ public interface Nested<Param, Children> extends Serializable {
|
|||||||
*/
|
*/
|
||||||
Children filter(boolean condition, Consumer<Param> consumer);
|
Children filter(boolean condition, Consumer<Param> consumer);
|
||||||
|
|
||||||
default Children mustNot(Consumer<Param> consumer) {
|
/**
|
||||||
return mustNot(true, consumer);
|
* must not 嵌套 等价于 must条件取反,即 非must
|
||||||
|
*
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
|
default Children not(Consumer<Param> consumer) {
|
||||||
|
return not(true, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* must not 嵌套 等价于 must条件取反,即 非must
|
* must not 嵌套 等价于 must条件取反,即 非must
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 条件
|
||||||
* @param consumer 条件函数
|
* @param consumer 嵌套条件函数
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children mustNot(boolean condition, Consumer<Param> consumer);
|
Children not(boolean condition, Consumer<Param> consumer);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param path 上级路径
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children nested(String path, Consumer<Param> consumer) {
|
default Children nested(String path, Consumer<Param> consumer) {
|
||||||
return nested(true, path, consumer);
|
return nested(true, path, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 嵌套类型查询
|
||||||
|
*
|
||||||
|
* @param path 上级路径
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @param scoreMode 得分模式
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children nested(String path, Consumer<Param> consumer, ScoreMode scoreMode) {
|
default Children nested(String path, Consumer<Param> consumer, ScoreMode scoreMode) {
|
||||||
return nested(true, path, consumer, scoreMode);
|
return nested(true, path, consumer, scoreMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 嵌套类型查询
|
||||||
|
*
|
||||||
|
* @param condition 执行条件
|
||||||
|
* @param path 上级路径
|
||||||
|
* @param consumer 嵌套条件函数
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children nested(boolean condition, String path, Consumer<Param> consumer) {
|
default Children nested(boolean condition, String path, Consumer<Param> consumer) {
|
||||||
return nested(condition, path, consumer, ScoreMode.None);
|
return nested(condition, path, consumer, ScoreMode.None);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 嵌套查询
|
* 嵌套类型查询
|
||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 执行条件
|
||||||
* @param path 上级路径
|
* @param path 上级路径
|
||||||
* @param consumer 嵌套里的条件函数
|
* @param consumer 嵌套条件函数
|
||||||
* @return 泛型
|
* @param scoreMode 得分模式
|
||||||
* @author 此方法由社区开发者lym于1.x贡献,EE作者负责调整及整合至2.0
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children nested(boolean condition, String path, Consumer<Param> consumer, ScoreMode scoreMode);
|
Children nested(boolean condition, String path, Consumer<Param> consumer, ScoreMode scoreMode);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,11 +13,22 @@ import java.util.function.Predicate;
|
|||||||
* Copyright © 2021 xpc1024 All Rights Reserved
|
* Copyright © 2021 xpc1024 All Rights Reserved
|
||||||
**/
|
**/
|
||||||
public interface Query<Children, T, R> extends Serializable {
|
public interface Query<Children, T, R> extends Serializable {
|
||||||
|
/**
|
||||||
|
* 设置查询字段
|
||||||
|
*
|
||||||
|
* @param column 查询列
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children select(R column) {
|
default Children select(R column) {
|
||||||
return select(FieldUtils.getFieldNameNotConvertId(column));
|
return select(FieldUtils.getFieldNameNotConvertId(column));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置查询字段
|
||||||
|
*
|
||||||
|
* @param columns 查询列
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children select(R... columns) {
|
default Children select(R... columns) {
|
||||||
return select(Arrays.stream(columns).map(FieldUtils::getFieldNameNotConvertId).toArray(String[]::new));
|
return select(Arrays.stream(columns).map(FieldUtils::getFieldNameNotConvertId).toArray(String[]::new));
|
||||||
}
|
}
|
||||||
@ -27,7 +38,7 @@ public interface Query<Children, T, R> extends Serializable {
|
|||||||
* 设置查询字段
|
* 设置查询字段
|
||||||
*
|
*
|
||||||
* @param columns 查询列,支持多字段
|
* @param columns 查询列,支持多字段
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children select(String... columns);
|
Children select(String... columns);
|
||||||
|
|
||||||
@ -35,7 +46,7 @@ public interface Query<Children, T, R> extends Serializable {
|
|||||||
* 查询字段
|
* 查询字段
|
||||||
*
|
*
|
||||||
* @param predicate 预言
|
* @param predicate 预言
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children select(Predicate<EntityFieldInfo> predicate);
|
Children select(Predicate<EntityFieldInfo> predicate);
|
||||||
|
|
||||||
@ -44,14 +55,26 @@ public interface Query<Children, T, R> extends Serializable {
|
|||||||
*
|
*
|
||||||
* @param entityClass 实体类
|
* @param entityClass 实体类
|
||||||
* @param predicate 预言
|
* @param predicate 预言
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children select(Class<T> entityClass, Predicate<EntityFieldInfo> predicate);
|
Children select(Class<T> entityClass, Predicate<EntityFieldInfo> predicate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置不查询字段
|
||||||
|
*
|
||||||
|
* @param column 不查询列
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children notSelect(R column) {
|
default Children notSelect(R column) {
|
||||||
return notSelect(FieldUtils.getFieldNameNotConvertId(column));
|
return notSelect(FieldUtils.getFieldNameNotConvertId(column));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置不查询字段
|
||||||
|
*
|
||||||
|
* @param columns 不查询列
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children notSelect(R... columns) {
|
default Children notSelect(R... columns) {
|
||||||
return notSelect(Arrays.stream(columns).map(FieldUtils::getFieldNameNotConvertId).toArray(String[]::new));
|
return notSelect(Arrays.stream(columns).map(FieldUtils::getFieldNameNotConvertId).toArray(String[]::new));
|
||||||
}
|
}
|
||||||
@ -60,14 +83,26 @@ public interface Query<Children, T, R> extends Serializable {
|
|||||||
* 设置不查询字段
|
* 设置不查询字段
|
||||||
*
|
*
|
||||||
* @param columns 不查询字段,支持多字段
|
* @param columns 不查询字段,支持多字段
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children notSelect(String... columns);
|
Children notSelect(String... columns);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置当前操作的索引名称
|
||||||
|
*
|
||||||
|
* @param indexName 索引名
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children index(String indexName) {
|
default Children index(String indexName) {
|
||||||
return index(true, indexName);
|
return index(true, indexName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置当前操作的索引名称
|
||||||
|
*
|
||||||
|
* @param indexNames 索引名
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children index(String... indexNames) {
|
default Children index(String... indexNames) {
|
||||||
return index(true, indexNames);
|
return index(true, indexNames);
|
||||||
}
|
}
|
||||||
@ -77,7 +112,7 @@ public interface Query<Children, T, R> extends Serializable {
|
|||||||
*
|
*
|
||||||
* @param condition 条件
|
* @param condition 条件
|
||||||
* @param indexNames 索引名
|
* @param indexNames 索引名
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children index(boolean condition, String... indexNames);
|
Children index(boolean condition, String... indexNames);
|
||||||
|
|
||||||
|
|||||||
@ -10,14 +10,36 @@ import java.io.Serializable;
|
|||||||
* Copyright © 2021 xpc1024 All Rights Reserved
|
* Copyright © 2021 xpc1024 All Rights Reserved
|
||||||
**/
|
**/
|
||||||
public interface Update<Children, R> extends Serializable {
|
public interface Update<Children, R> extends Serializable {
|
||||||
|
/**
|
||||||
|
* 设置 更新 字段 的 SET 片段
|
||||||
|
*
|
||||||
|
* @param column 列
|
||||||
|
* @param val 值
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children set(R column, Object val) {
|
default Children set(R column, Object val) {
|
||||||
return set(true, column, val);
|
return set(true, column, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置 更新 字段 的 SET 片段
|
||||||
|
*
|
||||||
|
* @param column 列名 字符串
|
||||||
|
* @param val 值
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children set(String column, Object val) {
|
default Children set(String column, Object val) {
|
||||||
return set(true, column, val);
|
return set(true, column, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置 更新 字段 的 SET 片段
|
||||||
|
*
|
||||||
|
* @param condition 执行条件
|
||||||
|
* @param column 列
|
||||||
|
* @param val 值
|
||||||
|
* @return wrapper
|
||||||
|
*/
|
||||||
default Children set(boolean condition, R column, Object val) {
|
default Children set(boolean condition, R column, Object val) {
|
||||||
return set(condition, FieldUtils.getFieldName(column), val);
|
return set(condition, FieldUtils.getFieldName(column), val);
|
||||||
}
|
}
|
||||||
@ -28,7 +50,7 @@ public interface Update<Children, R> extends Serializable {
|
|||||||
* @param condition 条件
|
* @param condition 条件
|
||||||
* @param column 列
|
* @param column 列
|
||||||
* @param val 值
|
* @param val 值
|
||||||
* @return 泛型
|
* @return wrapper
|
||||||
*/
|
*/
|
||||||
Children set(boolean condition, String column, Object val);
|
Children set(boolean condition, String column, Object val);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -606,8 +606,8 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Children mustNot(boolean condition, Consumer<Param> consumer) {
|
public Children not(boolean condition, Consumer<Param> consumer) {
|
||||||
getWrapper().mustNot(condition, consumer);
|
getWrapper().not(condition, consumer);
|
||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -91,7 +91,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
|
|||||||
baseSortParams = new ArrayList<>();
|
baseSortParams = new ArrayList<>();
|
||||||
aggregationParamList = new ArrayList<>();
|
aggregationParamList = new ArrayList<>();
|
||||||
paramQueue = new LinkedList<>();
|
paramQueue = new LinkedList<>();
|
||||||
prevQueryType = AND_MUST;
|
prevQueryType = NESTED_AND;
|
||||||
parentIdQueue = new LinkedList<>();
|
parentIdQueue = new LinkedList<>();
|
||||||
prevQueryTypeQueue = new LinkedList<>();
|
prevQueryTypeQueue = new LinkedList<>();
|
||||||
}
|
}
|
||||||
@ -125,12 +125,12 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Children and(boolean condition, Consumer<Children> consumer) {
|
public Children and(boolean condition, Consumer<Children> consumer) {
|
||||||
return addNested(condition, AND_MUST, consumer);
|
return addNested(condition, NESTED_AND, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Children or(boolean condition, Consumer<Children> consumer) {
|
public Children or(boolean condition, Consumer<Children> consumer) {
|
||||||
return addNested(condition, OR_SHOULD, consumer);
|
return addNested(condition, NESTED_OR, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -139,7 +139,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
|
|||||||
for (int i = paramQueue.size() - 1; i >= 0; i--) {
|
for (int i = paramQueue.size() - 1; i >= 0; i--) {
|
||||||
Param param = paramQueue.get(i);
|
Param param = paramQueue.get(i);
|
||||||
if (Objects.equals(level, param.getLevel())) {
|
if (Objects.equals(level, param.getLevel())) {
|
||||||
param.setPrevQueryType(OR_SHOULD);
|
param.setPrevQueryType(NESTED_OR);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,17 +148,17 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Children must(boolean condition, Consumer<Children> consumer) {
|
public Children must(boolean condition, Consumer<Children> consumer) {
|
||||||
return addNested(condition, AND_MUST, consumer);
|
return addNested(condition, NESTED_AND, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Children should(boolean condition, Consumer<Children> consumer) {
|
public Children should(boolean condition, Consumer<Children> consumer) {
|
||||||
return addNested(condition, OR_SHOULD, consumer);
|
return addNested(condition, NESTED_OR, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Children filter(boolean condition, Consumer<Children> consumer) {
|
public Children filter(boolean condition, Consumer<Children> consumer) {
|
||||||
return addNested(condition, AND_FILTER, consumer);
|
return addNested(condition, NESTED_FILTER, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -172,8 +172,8 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Children mustNot(boolean condition, Consumer<Children> consumer) {
|
public Children not(boolean condition, Consumer<Children> consumer) {
|
||||||
return addNested(condition, MUST_NOT, consumer);
|
return addNested(condition, NESTED_NOT, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -701,10 +701,10 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
|
|||||||
processJoin(param);
|
processJoin(param);
|
||||||
|
|
||||||
// 这两种情况需要重置其prevType
|
// 这两种情况需要重置其prevType
|
||||||
if (MUST_NOT.equals(queryTypeEnum)) {
|
if (NESTED_NOT.equals(queryTypeEnum)) {
|
||||||
prevQueryType = MUST_NOT;
|
prevQueryType = NESTED_NOT;
|
||||||
} else if (FILTER.equals(queryTypeEnum)) {
|
} else if (NESTED_FILTER.equals(queryTypeEnum)) {
|
||||||
prevQueryType = FILTER;
|
prevQueryType = NESTED_FILTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
paramQueue.add(param);
|
paramQueue.add(param);
|
||||||
@ -734,13 +734,13 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
|
|||||||
Param prev = paramQueue.peekLast();
|
Param prev = paramQueue.peekLast();
|
||||||
if (OR.equals(prev.getQueryTypeEnum())) {
|
if (OR.equals(prev.getQueryTypeEnum())) {
|
||||||
// 上一节点是拼接or() 需要重置其prevQueryType类型,让其走should查询
|
// 上一节点是拼接or() 需要重置其prevQueryType类型,让其走should查询
|
||||||
param.setPrevQueryType(OR_SHOULD);
|
param.setPrevQueryType(NESTED_OR);
|
||||||
} else if (NOT.equals(prev.getQueryTypeEnum())) {
|
} else if (NOT.equals(prev.getQueryTypeEnum())) {
|
||||||
// 上一节点是拼接not() 需要重置其prevQueryType类型,让其走must_not查询
|
// 上一节点是拼接not() 需要重置其prevQueryType类型,让其走must_not查询
|
||||||
param.setPrevQueryType(MUST_NOT);
|
param.setPrevQueryType(NESTED_NOT);
|
||||||
} else if (FILTER.equals(prev.getPrevQueryType())) {
|
} else if (FILTER.equals(prev.getPrevQueryType())) {
|
||||||
// 上一节点是拼接filter() 需要重置其prevQueryType类型,让其走filter查询
|
// 上一节点是拼接filter() 需要重置其prevQueryType类型,让其走filter查询
|
||||||
param.setPrevQueryType(AND_FILTER);
|
param.setPrevQueryType(NESTED_FILTER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -125,7 +125,7 @@ public interface BaseEsMapper<T> {
|
|||||||
String executeDSL(String dsl, String indexName);
|
String executeDSL(String dsl, String indexName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 标准查询
|
* 混合查询
|
||||||
*
|
*
|
||||||
* @param wrapper 条件
|
* @param wrapper 条件
|
||||||
* @return es标准结果
|
* @return es标准结果
|
||||||
|
|||||||
@ -234,10 +234,10 @@ public class WrapperProcessor {
|
|||||||
setBool(bool, queryBuilder, param.getPrevQueryType());
|
setBool(bool, queryBuilder, param.getPrevQueryType());
|
||||||
break;
|
break;
|
||||||
// 下面五种嵌套类型 需要对孩子节点递归处理
|
// 下面五种嵌套类型 需要对孩子节点递归处理
|
||||||
case AND_MUST:
|
case NESTED_AND:
|
||||||
case AND_FILTER:
|
case NESTED_FILTER:
|
||||||
case MUST_NOT:
|
case NESTED_NOT:
|
||||||
case OR_SHOULD:
|
case NESTED_OR:
|
||||||
queryBuilder = getBool(children, QueryBuilders.boolQuery(), entityInfo, null);
|
queryBuilder = getBool(children, QueryBuilders.boolQuery(), entityInfo, null);
|
||||||
setBool(bool, queryBuilder, param.getPrevQueryType());
|
setBool(bool, queryBuilder, param.getPrevQueryType());
|
||||||
break;
|
break;
|
||||||
@ -262,13 +262,13 @@ public class WrapperProcessor {
|
|||||||
* @param parentType 查询类型
|
* @param parentType 查询类型
|
||||||
*/
|
*/
|
||||||
private static void setBool(BoolQueryBuilder bool, QueryBuilder queryBuilder, EsQueryTypeEnum parentType) {
|
private static void setBool(BoolQueryBuilder bool, QueryBuilder queryBuilder, EsQueryTypeEnum parentType) {
|
||||||
if (AND_MUST.equals(parentType)) {
|
if (NESTED_AND.equals(parentType)) {
|
||||||
bool.must(queryBuilder);
|
bool.must(queryBuilder);
|
||||||
} else if (OR_SHOULD.equals(parentType)) {
|
} else if (NESTED_OR.equals(parentType)) {
|
||||||
bool.should(queryBuilder);
|
bool.should(queryBuilder);
|
||||||
} else if (AND_FILTER.equals(parentType)) {
|
} else if (NESTED_FILTER.equals(parentType)) {
|
||||||
bool.filter(queryBuilder);
|
bool.filter(queryBuilder);
|
||||||
} else if (MUST_NOT.equals(parentType)) {
|
} else if (NESTED_NOT.equals(parentType)) {
|
||||||
bool.mustNot(queryBuilder);
|
bool.mustNot(queryBuilder);
|
||||||
} else {
|
} else {
|
||||||
// by default
|
// by default
|
||||||
|
|||||||
@ -11,7 +11,7 @@ easy-es:
|
|||||||
print-dsl: false
|
print-dsl: false
|
||||||
db-config:
|
db-config:
|
||||||
map-underscore-to-camel-case: true
|
map-underscore-to-camel-case: true
|
||||||
# table-prefix: dev_
|
table-prefix: dev_
|
||||||
id-type: customize
|
id-type: customize
|
||||||
field-strategy: not_empty
|
field-strategy: not_empty
|
||||||
refresh-policy: immediate
|
refresh-policy: immediate
|
||||||
|
|||||||
@ -46,6 +46,11 @@ public class Document {
|
|||||||
*/
|
*/
|
||||||
@IndexField(fieldType = FieldType.TEXT, fieldData = true)
|
@IndexField(fieldType = FieldType.TEXT, fieldData = true)
|
||||||
private String filedData;
|
private String filedData;
|
||||||
|
/**
|
||||||
|
* ip字段
|
||||||
|
*/
|
||||||
|
@IndexField(fieldType = FieldType.IP)
|
||||||
|
private String ipAddress;
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -26,7 +26,6 @@ import lombok.NoArgsConstructor;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class Faq {
|
public class Faq {
|
||||||
@IndexField(value = "faq_name", fieldType = FieldType.TEXT)
|
|
||||||
private String faqName;
|
private String faqName;
|
||||||
@IndexField(value = "answer")
|
@IndexField(value = "answer")
|
||||||
private String faqAnswer;
|
private String faqAnswer;
|
||||||
|
|||||||
@ -66,6 +66,7 @@ public class AllTest {
|
|||||||
document.setTitle("测试文档1");
|
document.setTitle("测试文档1");
|
||||||
document.setContent("测试内容1");
|
document.setContent("测试内容1");
|
||||||
document.setCreator("老汉1");
|
document.setCreator("老汉1");
|
||||||
|
document.setIpAddress("192.168.1.1");
|
||||||
document.setLocation("40.171975,116.587105");
|
document.setLocation("40.171975,116.587105");
|
||||||
document.setGmtCreate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
document.setGmtCreate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||||
document.setCustomField("自定义字段1");
|
document.setCustomField("自定义字段1");
|
||||||
@ -187,6 +188,7 @@ public class AllTest {
|
|||||||
@Order(6)
|
@Order(6)
|
||||||
public void testSelectOne() {
|
public void testSelectOne() {
|
||||||
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
|
||||||
wrapper.match(Document::getContent, "内容")
|
wrapper.match(Document::getContent, "内容")
|
||||||
.orderByAsc(Document::getStarNum, Document::getEsId)
|
.orderByAsc(Document::getStarNum, Document::getEsId)
|
||||||
.limit(1);
|
.limit(1);
|
||||||
@ -226,6 +228,15 @@ public class AllTest {
|
|||||||
Assertions.assertEquals(22, documents.size());
|
Assertions.assertEquals(22, documents.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(6)
|
||||||
|
public void testIp(){
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper.eq(Document::getIpAddress,"192.168.0.0/16");
|
||||||
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
|
Assertions.assertEquals(documents.size(),1);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Order(6)
|
@Order(6)
|
||||||
public void testSelectCount() {
|
public void testSelectCount() {
|
||||||
@ -525,10 +536,10 @@ public class AllTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Order(6)
|
@Order(6)
|
||||||
public void testConditionMustNot() {
|
public void testConditionNot() {
|
||||||
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
wrapper.in(Document::getStarNum, 10,11,12,13)
|
wrapper.in(Document::getStarNum, 10,11,12,13)
|
||||||
.mustNot(i->i.eq(Document::getTitle,"测试文档10").eq(Document::getTitle,"测试文档11"));
|
.not(i->i.eq(Document::getTitle,"测试文档10").eq(Document::getTitle,"测试文档11"));
|
||||||
List<Document> documents = documentMapper.selectList(wrapper);
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
Assertions.assertEquals(2, documents.size());
|
Assertions.assertEquals(2, documents.size());
|
||||||
}
|
}
|
||||||
@ -876,7 +887,7 @@ public class AllTest {
|
|||||||
@Order(9)
|
@Order(9)
|
||||||
public void testComplex() {
|
public void testComplex() {
|
||||||
// SQL写法
|
// SQL写法
|
||||||
// where business_type = 1 and (state = 9 or (state = 8 and bidding_sign = 1)) or business_type = 2 and state in (2,3)
|
// where business_type = 1 and (state = 9 or (state = 8 and bidding_sign = 1)) or (business_type = 2 and state in (2,3))
|
||||||
|
|
||||||
// RestHighLevelClient写法
|
// RestHighLevelClient写法
|
||||||
List<Integer> values = Arrays.asList(2, 3);
|
List<Integer> values = Arrays.asList(2, 3);
|
||||||
|
|||||||
162
easy-es-test/src/test/java/cn/easyes/test/mix/MixTest.java
Normal file
162
easy-es-test/src/test/java/cn/easyes/test/mix/MixTest.java
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
package cn.easyes.test.mix;
|
||||||
|
|
||||||
|
import cn.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
||||||
|
import cn.easyes.test.TestEasyEsApplication;
|
||||||
|
import cn.easyes.test.entity.Document;
|
||||||
|
import cn.easyes.test.mapper.DocumentMapper;
|
||||||
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
|
import org.elasticsearch.core.TimeValue;
|
||||||
|
import org.elasticsearch.index.query.QueryBuilders;
|
||||||
|
import org.elasticsearch.script.Script;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregationBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregationBuilders;
|
||||||
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||||
|
import org.elasticsearch.search.sort.ScriptSortBuilder;
|
||||||
|
import org.elasticsearch.search.sort.SortBuilders;
|
||||||
|
import org.elasticsearch.search.sort.SortOrder;
|
||||||
|
import org.junit.jupiter.api.MethodOrderer;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.TestMethodOrder;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 混合查询几种使用案例
|
||||||
|
*
|
||||||
|
* @ProductName: Hundsun HEP
|
||||||
|
* @ProjectName: easy-es
|
||||||
|
* @Package: cn.easyes.test.mix
|
||||||
|
* @Description: note
|
||||||
|
* @Author: xingpc37977
|
||||||
|
* @Date: 2023/3/13 10:48
|
||||||
|
* @UpdateUser: xingpc37977
|
||||||
|
* @UpdateDate: 2023/3/13 10:48
|
||||||
|
* @UpdateRemark: The modified content
|
||||||
|
* @Version: 1.0
|
||||||
|
* <p>
|
||||||
|
* Copyright © 2023 Hundsun Technologies Inc. All Rights Reserved
|
||||||
|
**/
|
||||||
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
|
@SpringBootTest(classes = TestEasyEsApplication.class)
|
||||||
|
public class MixTest {
|
||||||
|
@Resource
|
||||||
|
private DocumentMapper documentMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 混合查询正确使用姿势1: EE提供的功能不支持某些过细粒度的功能,所有查询条件通过原生语法构造,仅利用EE提供的数据解析功能
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMix1() {
|
||||||
|
// RestHighLevelClient原生语法
|
||||||
|
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
||||||
|
searchSourceBuilder.query(QueryBuilders.matchQuery("content", "推*").minimumShouldMatch("80%"));
|
||||||
|
|
||||||
|
// 仅利用EE查询并解析数据功能
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper.setSearchSourceBuilder(searchSourceBuilder);
|
||||||
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
|
System.out.println(documents);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 混合查询正确使用姿势2: 其它都能支持,仅排序器不支持,这种情况可以只按ES原生语法构造所需排序器SortBuilder,其它用EE完成
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMix2() {
|
||||||
|
// EE满足的语法
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper.eq(Document::getTitle, "老汉")
|
||||||
|
.match(Document::getContent, "推*");
|
||||||
|
|
||||||
|
// RestHighLevelClient原生语法
|
||||||
|
Script script = new Script("doc['star_num'].value");
|
||||||
|
ScriptSortBuilder scriptSortBuilder = SortBuilders.scriptSort(script, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC);
|
||||||
|
|
||||||
|
// 利用EE查询并解析数据
|
||||||
|
wrapper.sort(scriptSortBuilder);
|
||||||
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
|
System.out.println(documents);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 混合查询正确使用姿势3: 其它功能都能支持,但需要向SearchSourceBuilder中追加非query参数
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMix3() {
|
||||||
|
// EE满足的语法
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper.eq(Document::getTitle, "老汉")
|
||||||
|
.match(Document::getContent, "推*");
|
||||||
|
SearchSourceBuilder searchSourceBuilder = documentMapper.getSearchSourceBuilder(wrapper);
|
||||||
|
|
||||||
|
// 追加或者设置一些SearchSourceBuilder支持但EE暂不支持的参数 不建议追加query参数,因为如果追加query参数会直接覆盖上面EE已经帮你生成好的query,以最后set的query为准
|
||||||
|
searchSourceBuilder.timeout(TimeValue.timeValueSeconds(3L));
|
||||||
|
wrapper.setSearchSourceBuilder(searchSourceBuilder);
|
||||||
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
|
System.out.println(documents);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询条件中可以利用大多数基本查询,但EE提供的聚合功能不能满足需求的情况下,需要自定义聚合器
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void textMix4() {
|
||||||
|
// EE满足的语法
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper.eq(Document::getTitle, "老汉")
|
||||||
|
.match(Document::getContent, "推*");
|
||||||
|
SearchSourceBuilder searchSourceBuilder = documentMapper.getSearchSourceBuilder(wrapper);
|
||||||
|
|
||||||
|
// RestHighLevelClient原生语法
|
||||||
|
AggregationBuilder aggregation = AggregationBuilders.terms("titleAgg")
|
||||||
|
.field("title");
|
||||||
|
searchSourceBuilder.aggregation(aggregation);
|
||||||
|
wrapper.setSearchSourceBuilder(searchSourceBuilder);
|
||||||
|
SearchResponse searchResponse = documentMapper.search(wrapper);
|
||||||
|
// tip: 聚合后的信息是动态的,框架无法解析,需要用户根据聚合器类型自行从桶中解析,参考RestHighLevelClient官方Aggregation解析文档
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不支持的混合查询1: 追加覆盖问题
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void textNotSupportMix() {
|
||||||
|
// EE满足的语法
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper.eq(Document::getTitle, "老汉")
|
||||||
|
.match(Document::getContent, "推*");
|
||||||
|
SearchSourceBuilder searchSourceBuilder = documentMapper.getSearchSourceBuilder(wrapper);
|
||||||
|
|
||||||
|
// 用户又想在上面的基础上,再追加一些个性化的查询参数进去 但实际上此时执行查询时,查询条件仅仅是最后设置的title=隔壁老王,前面的老汉推*会被覆盖
|
||||||
|
searchSourceBuilder.query(QueryBuilders.matchQuery("title", "隔壁老王"));
|
||||||
|
wrapper.setSearchSourceBuilder(searchSourceBuilder);
|
||||||
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
|
System.out.println(documents);
|
||||||
|
// 思考: 为什么会被覆盖? 因为目前技术上做不到,查询树已经建立好了,es底层并没有提供向树的指定层级上继续追加查询条件的API
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不支持的混合查询2: 脱裤子放P 自欺欺人系列
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testNotSupportMix2() {
|
||||||
|
// EE满足的语法
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper.eq(Document::getTitle, "老汉")
|
||||||
|
.match(Document::getContent, "推*");
|
||||||
|
|
||||||
|
// SearchSourceBuilder的构造是自己new出来的,不是通过mapper.getSearchSourceBuilder(wrapper)构造 相当于脱裤子放P,那么上面的查询条件老汉推*自然不会生效
|
||||||
|
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
||||||
|
searchSourceBuilder.minScore(10.5f);
|
||||||
|
wrapper.setSearchSourceBuilder(searchSourceBuilder);
|
||||||
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
|
System.out.println(documents);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -78,31 +78,36 @@ public class NestedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNestedMatch() {
|
public void testNestedMatch() {
|
||||||
// 嵌套查询 查询年龄等于18或8,且密码等于123的数据
|
// 嵌套查询 查询年龄等于18或8,且密码等于12345的数据
|
||||||
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
|
||||||
wrapper.nested(FieldUtils.val(Document::getUsers), w ->
|
wrapper.nested(FieldUtils.val(Document::getUsers), w ->
|
||||||
w.in(FieldUtils.val(User::getAge), 18, 8)
|
w.in("users.age", 8)
|
||||||
.eq(FieldUtils.val(User::getPassword), "123"));
|
.eq("users.password", "12345"));
|
||||||
List<Document> documents = documentMapper.selectList(wrapper);
|
List<Document> documents = documentMapper.selectList(wrapper);
|
||||||
System.out.println(documents);
|
System.out.println(documents);
|
||||||
|
|
||||||
// 嵌套类型中的字段获取可以用FieldUtils.val或直接传入字符串
|
// 嵌套类型中的字段获取可以用FieldUtils.val或直接传入字符串
|
||||||
LambdaEsQueryWrapper<Document> wrapper1 = new LambdaEsQueryWrapper<>();
|
LambdaEsQueryWrapper<Document> wrapper1 = new LambdaEsQueryWrapper<>();
|
||||||
wrapper1.match(Document::getContent, "人才")
|
wrapper1.eq(Document::getTitle,"老汉")
|
||||||
.nested("users.faqs", w -> w.eq(FieldUtils.val(Faq::getFaqAnswer), "回答4")
|
.nested("users.faqs", w -> w.eq("users.faqs.answer", "a4")
|
||||||
.match("faqName", "问题3"))
|
.match("users.faqs.faq_name", "q4"))
|
||||||
.nested("users", w -> w.between("age", 10, 19))
|
.nested("users", w -> w.between("users.age", 1, 30))
|
||||||
.match(Document::getCreator, "吃饭");
|
.match(Document::getCreator, "吃饭");
|
||||||
List<Document> documents1 = documentMapper.selectList(wrapper1);
|
List<Document> documents1 = documentMapper.selectList(wrapper1);
|
||||||
System.out.println(documents1);
|
System.out.println(documents1);
|
||||||
|
|
||||||
LambdaEsQueryWrapper<Document> wrapper2 = new LambdaEsQueryWrapper<>();
|
LambdaEsQueryWrapper<Document> wrapper2 = new LambdaEsQueryWrapper<>();
|
||||||
wrapper2.nested("users", w -> w.in("age", 18))
|
wrapper2.nested("users", w -> w.in("users.age", 18))
|
||||||
.or()
|
.or()
|
||||||
.nested("users.faqs", w -> w.match("faq_name", "q3"));
|
.nested("users.faqs", w -> w.match("users.faqs.faq_name", "q3"));
|
||||||
List<Document> documents2 = documentMapper.selectList(wrapper2);
|
List<Document> documents2 = documentMapper.selectList(wrapper2);
|
||||||
|
|
||||||
System.out.println(documents2);
|
System.out.println(documents2);
|
||||||
|
|
||||||
|
LambdaEsQueryWrapper<Document> wrapper3 = new LambdaEsQueryWrapper<>();
|
||||||
|
wrapper3.nested("users.faqs",w->w.match("users.faqs.faq_name", "q3").or().match("users.faqs.faq_name","q4"));
|
||||||
|
List<Document> documents3 = documentMapper.selectList(wrapper3);
|
||||||
|
System.out.println(documents3);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user