From bba07ca3ecf39ebe0c867422719990406a0a8321 Mon Sep 17 00:00:00 2001
From: xpc1024 <252645816@qq.com>
Date: Mon, 30 Jan 2023 16:50:26 +0800
Subject: [PATCH] =?UTF-8?q?v2.0-beta=20=E4=BF=AE=E5=A4=8D=E4=B8=80?=
=?UTF-8?q?=E4=BA=9B=E6=B5=8B=E8=AF=95=E4=B8=AD=E5=8F=91=E7=8E=B0=E7=9A=84?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../easyes/common/enums/EsQueryTypeEnum.java | 12 ++-
.../cn/easyes/common/utils/MyOptional.java | 13 ++-
.../core/conditions/AbstractWrapper.java | 29 ++----
.../core/conditions/LambdaEsQueryWrapper.java | 12 ---
.../core/conditions/WrapperProcessor.java | 23 ++---
.../core/conditions/interfaces/Compare.java | 13 ++-
.../core/conditions/interfaces/Query.java | 13 ---
.../test/java/cn/easyes/test/all/AllTest.java | 96 ++++++++++++-------
8 files changed, 112 insertions(+), 99 deletions(-)
diff --git a/easy-es-common/src/main/java/cn/easyes/common/enums/EsQueryTypeEnum.java b/easy-es-common/src/main/java/cn/easyes/common/enums/EsQueryTypeEnum.java
index 865b4a68..87a7ebbe 100644
--- a/easy-es-common/src/main/java/cn/easyes/common/enums/EsQueryTypeEnum.java
+++ b/easy-es-common/src/main/java/cn/easyes/common/enums/EsQueryTypeEnum.java
@@ -59,6 +59,10 @@ public enum EsQueryTypeEnum {
* 前缀匹配
*/
MATCH_PHRASE_PREFIX,
+ /**
+ * 查询全部 相当于Mysql中的select * 无where条件 谨慎使用
+ */
+ MATCH_ALL,
/**
* 多字段匹配
*/
@@ -102,7 +106,11 @@ public enum EsQueryTypeEnum {
*/
FILTER,
/**
- * 或条件,相当于MYSQL中的OR
+ * 或条件,相当于MYSQL中的OR 和MP中的or嵌套用法一致
*/
- OR_SHOULD;
+ OR_SHOULD,
+ /**
+ * 或条件,仅影响紧跟其后的一个条件,和MP中的拼接or用法一致
+ */
+ OR;
}
diff --git a/easy-es-common/src/main/java/cn/easyes/common/utils/MyOptional.java b/easy-es-common/src/main/java/cn/easyes/common/utils/MyOptional.java
index 0a3f1a3a..276f4a29 100644
--- a/easy-es-common/src/main/java/cn/easyes/common/utils/MyOptional.java
+++ b/easy-es-common/src/main/java/cn/easyes/common/utils/MyOptional.java
@@ -3,10 +3,11 @@ package cn.easyes.common.utils;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
+import java.util.function.Supplier;
/**
- * 对JDK提供的Optional的自定义,个人认为其高频api ifPresent没有返回用起来不方便
- * 可避免写过多if-else 提升代码优雅
+ * 对JDK提供的Optional的自定义增强
+ * 可在一定程度上减少代码中出现的if-else 提升代码优雅
*
* Copyright © 2021 xpc1024 All Rights Reserved
**/
@@ -50,6 +51,14 @@ public final class MyOptional {
}
}
+ public void ifPresent(Consumer super T> present, Supplier> other) {
+ if (value != null) {
+ present.accept(value);
+ } else {
+ other.get();
+ }
+ }
+
public MyOptional ifPresent(Function super T, ? extends U> present, T otherValue) {
Objects.requireNonNull(present);
if (isPresent())
diff --git a/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractWrapper.java b/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractWrapper.java
index 05cf5990..b98db5d8 100644
--- a/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractWrapper.java
+++ b/easy-es-core/src/main/java/cn/easyes/core/conditions/AbstractWrapper.java
@@ -7,12 +7,8 @@ import cn.easyes.common.utils.*;
import cn.easyes.core.Param;
import cn.easyes.core.biz.AggregationParam;
import cn.easyes.core.biz.BaseSortParam;
-import cn.easyes.core.biz.GeoParam;
import cn.easyes.core.biz.OrderByParam;
-import cn.easyes.core.conditions.interfaces.Compare;
-import cn.easyes.core.conditions.interfaces.Func;
-import cn.easyes.core.conditions.interfaces.Geo;
-import cn.easyes.core.conditions.interfaces.Nested;
+import cn.easyes.core.conditions.interfaces.*;
import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.common.geo.GeoDistance;
import org.elasticsearch.common.geo.GeoPoint;
@@ -37,7 +33,7 @@ import static cn.easyes.common.enums.OrderTypeEnum.CUSTOMIZE;
* Copyright © 2021 xpc1024 All Rights Reserved
**/
public abstract class AbstractWrapper> extends Wrapper
- implements Compare, Nested, Func, Geo {
+ implements Compare, Nested, Func, Join, Geo {
protected final Children typedThis = (Children) this;
@@ -70,20 +66,11 @@ public abstract class AbstractWrapper orderByParams;
- /**
- * 是否查询全部文档
- */
- protected Boolean matchAllQuery;
/**
* 实体对象
*/
@@ -164,6 +151,11 @@ public abstract class AbstractWrapper consumer) {
return addNested(condition, AND_MUST, consumer);
@@ -217,11 +209,8 @@ public abstract class AbstractWrapper extends AbstractLambdaQueryWrapper extends AbstractLambdaQueryWrapper enableMust2Filter(boolean condition, boolean enable) {
- if (condition) {
- this.enableMust2Filter = enable;
- }
- return typedThis;
- }
-
@Override
public LambdaEsQueryWrapper setSearchSourceBuilder(boolean condition, SearchSourceBuilder searchSourceBuilder) {
if (condition) {
diff --git a/easy-es-core/src/main/java/cn/easyes/core/conditions/WrapperProcessor.java b/easy-es-core/src/main/java/cn/easyes/core/conditions/WrapperProcessor.java
index 2703f216..f667217b 100644
--- a/easy-es-core/src/main/java/cn/easyes/core/conditions/WrapperProcessor.java
+++ b/easy-es-core/src/main/java/cn/easyes/core/conditions/WrapperProcessor.java
@@ -59,9 +59,6 @@ public class WrapperProcessor {
// 初始化boolQueryBuilder 参数
BoolQueryBuilder boolQueryBuilder = initBoolQueryBuilder(wrapper.paramList, entityClass);
- // 初始化全表扫描查询参数
- Optional.ofNullable(wrapper.matchAllQuery).ifPresent(p -> boolQueryBuilder.must(QueryBuilders.matchAllQuery()));
-
// 初始化searchSourceBuilder 参数
SearchSourceBuilder searchSourceBuilder = initSearchSourceBuilder(wrapper, entityClass);
@@ -87,9 +84,9 @@ public class WrapperProcessor {
String realField = FieldUtils.getRealField(param.getColumn(), entityInfo.getMappingColumnMap(), dbConfig);
param.setColumn(realField);
if (ArrayUtils.isNotEmpty(param.getColumns())) {
- String[] columns = (String[]) Arrays.stream(param.getColumns())
- .map(column -> FieldUtils.getRealField(param.getColumn(), entityInfo.getMappingColumnMap(), dbConfig))
- .toArray();
+ String[] columns = Arrays.stream(param.getColumns())
+ .map(column -> FieldUtils.getRealField(column, entityInfo.getMappingColumnMap(), dbConfig))
+ .toArray(String[]::new);
param.setColumns(columns);
}
if (NESTED_MATCH.equals(param.getQueryTypeEnum()) || HAS_CHILD.equals(param.getQueryTypeEnum()) || HAS_PARENT.equals(param.getQueryTypeEnum())) {
@@ -156,7 +153,11 @@ public class WrapperProcessor {
setChildrenBool(bool, queryBuilder, parentType);
break;
case MULTI_MATCH:
- queryBuilder = QueryBuilders.multiMatchQuery(param.getVal(), param.getColumns()).operator((Operator) param.getExt1()).minimumShouldMatch((String) param.getExt2());
+ queryBuilder = QueryBuilders.multiMatchQuery(param.getVal(), param.getColumns()).operator((Operator) param.getExt1()).minimumShouldMatch(String.valueOf(param.getExt2()));
+ setChildrenBool(bool, queryBuilder, parentType);
+ break;
+ case MATCH_ALL:
+ queryBuilder = QueryBuilders.matchAllQuery().boost(param.getBoost());
setChildrenBool(bool, queryBuilder, parentType);
break;
case QUERY_STRING:
@@ -192,7 +193,7 @@ public class WrapperProcessor {
setChildrenBool(bool, queryBuilder, parentType);
break;
case TERMS:
- queryBuilder = QueryBuilders.termsQuery(param.getColumn(), (Object[]) param.getVal());
+ queryBuilder = QueryBuilders.termsQuery(param.getColumn(), (Collection>) param.getVal());
setChildrenBool(bool, queryBuilder, parentType);
break;
case EXISTS:
@@ -204,9 +205,9 @@ public class WrapperProcessor {
setChildrenBool(bool, queryBuilder, parentType);
break;
case GEO_DISTANCE:
- GeoDistanceQueryBuilder geoDistance = QueryBuilders.geoDistanceQuery(param.getColumn()).point((GeoPoint) param.getExt2()).boost(param.getBoost());
- MyOptional.ofNullable(param.getExt1()).ifPresent(ext1 -> geoDistance.distance((Double) param.getVal(), (DistanceUnit) ext1), geoDistance.distance((String) param.getVal()));
- queryBuilder = geoDistance;
+ GeoDistanceQueryBuilder geoDistanceBuilder = QueryBuilders.geoDistanceQuery(param.getColumn()).point((GeoPoint) param.getExt2()).boost(param.getBoost());
+ MyOptional.ofNullable(param.getExt1()).ifPresent(ext1 -> geoDistanceBuilder.distance((double) param.getVal(), (DistanceUnit) ext1), () -> geoDistanceBuilder.distance((String) param.getVal()));
+ queryBuilder = geoDistanceBuilder;
setChildrenBool(bool, queryBuilder, parentType);
break;
case GEO_POLYGON:
diff --git a/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Compare.java b/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Compare.java
index 63d7b4af..4a2301d6 100644
--- a/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Compare.java
+++ b/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Compare.java
@@ -360,16 +360,25 @@ public interface Compare extends Serializable {
default Children matchAllQuery() {
- return matchAllQuery(true);
+ return matchAllQuery(true, DEFAULT_BOOST);
+ }
+
+ default Children matchAllQuery(Float boost) {
+ return matchAllQuery(true, boost);
+ }
+
+ default Children matchAllQuery(boolean condition) {
+ return matchAllQuery(condition, DEFAULT_BOOST);
}
/**
* 查询全部文档
*
* @param condition 条件
+ * @param boost 权重值
* @return 泛型
*/
- Children matchAllQuery(boolean condition);
+ Children matchAllQuery(boolean condition, Float boost);
default Children matchPhrasePrefixQuery(R column, Object val) {
diff --git a/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Query.java b/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Query.java
index abfe2249..5ac1ecb9 100644
--- a/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Query.java
+++ b/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/Query.java
@@ -116,19 +116,6 @@ public interface Query extends Serializable {
Children index(boolean condition, String... indexNames);
- default Children enableMust2Filter(boolean enable) {
- return enableMust2Filter(true, enable);
- }
-
- /**
- * must 条件转filter 默认不转换
- *
- * @param condition 条件
- * @param enable 是否开启 true开启 false 不开启 默认不开转换
- * @return 泛型
- */
- Children enableMust2Filter(boolean condition, boolean enable);
-
default Children setSearchSourceBuilder(SearchSourceBuilder searchSourceBuilder) {
return setSearchSourceBuilder(true, searchSourceBuilder);
}
diff --git a/easy-es-test/src/test/java/cn/easyes/test/all/AllTest.java b/easy-es-test/src/test/java/cn/easyes/test/all/AllTest.java
index de1c1eaf..e9241718 100644
--- a/easy-es-test/src/test/java/cn/easyes/test/all/AllTest.java
+++ b/easy-es-test/src/test/java/cn/easyes/test/all/AllTest.java
@@ -14,6 +14,7 @@ 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.client.RestHighLevelClient;
import org.elasticsearch.common.geo.GeoDistance;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.common.geo.ShapeRelation;
@@ -21,6 +22,7 @@ import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.geometry.Circle;
import org.elasticsearch.geometry.Point;
import org.elasticsearch.geometry.Rectangle;
+import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
@@ -34,6 +36,7 @@ import org.elasticsearch.search.sort.GeoDistanceSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.*;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@@ -53,6 +56,8 @@ import java.util.*;
public class AllTest {
@Resource
private DocumentMapper documentMapper;
+ @Autowired
+ private RestHighLevelClient client;
// 1.新增
@Test
@@ -62,8 +67,8 @@ public class AllTest {
Document document = new Document();
document.setEsId("1");
document.setTitle("测试文档1");
- document.setContent("阿凡达");
- document.setCreator("流量");
+ document.setContent("测试内容1");
+ document.setCreator("老汉1");
document.setLocation("40.171975,116.587105");
document.setGmtCreate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
document.setCustomField("自定义字段1");
@@ -302,6 +307,17 @@ public class AllTest {
Assertions.assertEquals(1, documents.size());
}
+ @Test
+ @Order(6)
+ public void testConditionExists() {
+ // exists等价于isNotNull 在es中更推荐此种语法
+ LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();
+ wrapper.exists(Document::getNullField);
+ List documents = documentMapper.selectList(wrapper);
+ Assertions.assertEquals(1, documents.size());
+ }
+
+
@Test
@Order(6)
public void testConditionIn() {
@@ -433,17 +449,6 @@ public class AllTest {
Assertions.assertEquals(22, documents.size());
}
- @Test
- @Order(6)
- public void testConditionEnableMust2Filter() {
- LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();
- wrapper.match(Document::getCreator, "老汉")
- .enableMust2Filter(true);
- String source = documentMapper.getSource(wrapper);
- System.out.println(source);
- Assertions.assertTrue(source.contains("filter"));
- }
-
@Test
@Order(6)
public void testConditionAnd() {
@@ -454,6 +459,30 @@ public class AllTest {
Assertions.assertEquals(1, documents.size());
}
+ @Test
+ @Order(6)
+ public void testConditionOr() {
+ LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();
+ wrapper.and(w -> w.in(Document::getStarNum, 1, 2, 3, 4, 10, 11)
+ .eq(Document::getTitle, "测试文档10")
+ .match(Document::getCreator, "老汉")
+ .or(i -> i.eq(Document::getTitle, "测试文档11")));
+ List documents = documentMapper.selectList(wrapper);
+ Assertions.assertEquals(2, documents.size());
+ }
+
+ @Test
+ @Order(6)
+ public void testConditionOrInner() {
+ LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();
+ wrapper.and(w -> w.match(Document::getContent, "测试").match(Document::getCreator, "老汉")
+ .or(i -> i.eq(Document::getStarNum, 12))
+ );
+ List documents = documentMapper.selectList(wrapper);
+ Assertions.assertEquals(2, documents.size());
+ }
+
+
@Test
@Order(6)
public void testPageQuery() {
@@ -697,12 +726,12 @@ public class AllTest {
LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();
GeoPoint geoPoint = new GeoPoint(41.0, 116.0);
wrapper.geoDistance(Document::getLocation, 168.8, DistanceUnit.KILOMETERS, geoPoint);
- GeoDistanceSortBuilder geoDistanceSortBuilder = SortBuilders.geoDistanceSort(FieldUtils.val(Document::getLocation), geoPoint)
- .unit(DistanceUnit.KILOMETERS)
- .geoDistance(GeoDistance.ARC)
- .order(SortOrder.DESC);
-
- wrapper.sort(geoDistanceSortBuilder);
+// GeoDistanceSortBuilder geoDistanceSortBuilder = SortBuilders.geoDistanceSort(FieldUtils.val(Document::getLocation), geoPoint)
+// .unit(DistanceUnit.KILOMETERS)
+// .geoDistance(GeoDistance.ARC)
+// .order(SortOrder.DESC);
+//
+// wrapper.sort(geoDistanceSortBuilder);
List documents = documentMapper.selectList(wrapper);
Assertions.assertEquals(4, documents.size());
}
@@ -767,25 +796,18 @@ public class AllTest {
Assertions.assertTrue(lockDeleted);
}
-
@Test
- @Order(11)
- public void testAND() {
- LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();
- wrapper.eq(Document::getCreator, "老汉")
- .and(a -> a.eq(Document::getContent, "推车")
- .and(c -> c.eq(Document::getContent, "电车").eq(Document::getContent, "坏了"))
- .eq(Document::getCreator, "痴汉")
- .or(b -> b.eq(Document::getStarNum, 888).eq(Document::getCustomField, "不推车")
- .and(bb -> bb.eq(Document::getStarNum, 888).eq(Document::getCustomField, "不推车")
- .and(bbb -> bbb.eq(Document::getStarNum, 888).eq(Document::getCustomField, "不推车"))
- )
- )
- )
- .and(d -> d.eq(Document::getEsId, 666).eq(Document::getGmtCreate, "2023"))
- ;
- List documents = documentMapper.selectList(wrapper);
- System.out.println(documents);
+ @Order(21)
+ public void testDSL(){
+ // 设置检索条件
+ List values = Arrays.asList(2,3);
+ BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+ boolQueryBuilder.must(QueryBuilders.termQuery("business_type",1));
+ boolQueryBuilder.must(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("state",9))
+ .should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("state",8)).must(QueryBuilders.termQuery("bidding_sign",1))));
+ boolQueryBuilder.should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("business_type",2)).must(QueryBuilders.termsQuery("state",values)));
+ System.out.println(boolQueryBuilder.toString());
+ System.out.println();
}
}