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 present, Supplier other) { + if (value != null) { + present.accept(value); + } else { + other.get(); + } + } + public MyOptional ifPresent(Function 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(); } }