From 29ebc56632c4091835a1358db6cb153b244f3b94 Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Mon, 20 Nov 2023 15:46:12 +0800 Subject: [PATCH 01/12] Update README.md --- README.md | 204 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git a/README.md b/README.md index 6a66338..167d65a 100644 --- a/README.md +++ b/README.md @@ -362,6 +362,210 @@ String indexName = "document"; | ... | ... | ...| ## Advertising provider +

+ + East-Es-Logo + +

+ +

+ 您的Star是我继续前进的动力,如果喜欢EE请右上角帮忙点亮星星⭐! +

+ +

+ + maven + + + + code style + +

+ +# 官方地址 | Official website + +**easy-es官网** https://easy-es.cn/ + +**easy-es官方gitee** https://gitee.com/dromara/easy-es + +**easy-es官方github** https://github.com/dromara/easy-es + +**开源社区dromara** https://dromara.org/ + +**开源社区码云首页** https://gitee.com/dromara/ + +> **Tip:** 官网是vue单页面应用,首次访问加载可能比较慢🐢,主公们请耐心等待一下,后续会很快🏹,如偶遇打不开可刷新多尝试几次. + +# 简介 | Intro + +Easy-Es是一款简化ElasticSearch搜索引擎操作的开源框架,全自动智能索引托管. + +目前功能丰富度和易用度及性能已全面领先SpringData-Elasticsearch. + +简化`CRUD`及其它高阶操作,可以更好的帮助开发者减轻开发负担 + +底层采用Es官方提供的RestHighLevelClient,保证其原生性能及拓展性. + +技术讨论 QQ 群 :729148550 群内可在群文件中免费领取 颈椎保护 | 增肌 | 减脂 等健身计划 无套路 + +微信群请先添加作者微信,由作者拉入 (亦可咨询健身问题,作者是健身教练) + +项目推广初期,还望大家能够不吝点点三连:⭐Star,👀Watch,fork📌 + +支持一下国产开源,让更多人看到和使用本项目,非常感谢! + +# 优点 | Advantages + +- **全自动索引托管:** 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者 +- **智能字段类型推断:** 根据索引类型和当前查询类型上下文综合智能判断当前查询是否需要拼接.keyword后缀,减少小白误用的可能 +- **屏蔽语言差异:** 开发者只需要会MySQL语法即可使用Es +- **代码量极少:** 与直接使用RestHighLevelClient相比,相同的查询平均可以节3-8倍左右的代码量 +- **零魔法值:** 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值 +- **零额外学习成本:** 开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至Easy-Es +- **降低开发者门槛:** 即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发 +- **功能强大:** 支持MySQL的几乎全部功能,且对ES特有的分词,权重,高亮,嵌套,地理位置Geo,Ip地址查询等功能都支持 +- **语法优雅:** 所有条件构造器均支持Lambda风格链式编程,编程体验和代码可读性大幅提升 +- **安全可靠:** 墨菲安全扫描零风险,且代码单元测试综合覆盖率高达95%以上. +- **完善的中英文文档:** 提供了中英文双语操作文档,文档全面可靠,帮助您节省更多时间 +- **...** + +# 对比 | Compare + +> 需求:查询出文档标题为 "传统功夫"且作者为"码保国"的所有文档 +```java + // 使用Easy-Es仅需1行代码即可完成查询 + List documents = documentMapper.selectList(EsWrappers.lambdaQuery(Document.class).eq(Document::getTitle, "传统功夫").eq(Document::getCreator, "码保国")); +``` + + +```java + // 传统方式, 直接用RestHighLevelClient进行查询 需要19行代码,还不包含下划线转驼峰,自定义字段处理及_id处理等代码 + String indexName = "document"; + SearchRequest searchRequest = new SearchRequest(indexName); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + TermQueryBuilder titleTerm = QueryBuilders.termQuery("title", "传统功夫"); + TermsQueryBuilder creatorTerm = QueryBuilders.termsQuery("creator", "码保国"); + boolQueryBuilder.must(titleTerm); + boolQueryBuilder.must(creatorTerm); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(boolQueryBuilder); + searchRequest.source(searchSourceBuilder); + try { + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + List documents = Optional.ofNullable(searchResponse) + .map(SearchResponse::getHits) + .map(SearchHits::getHits) + .map(hit->Document document = JSON.parseObject(hit.getSourceAsString(),Document.class)) + .collect(Collectors.toList()); + } catch (IOException e) { + e.printStackTrace(); + } +``` +> * 以上只是简单查询演示,实际使用场景越复杂,效果就越好,平均可节省至少3-8倍代码量 +> * 传统功夫,点到为止! 上述功能仅供演示,仅为Easy-Es支持功能的冰山一角,Easy-Es就是这么Easy到不讲武德💪,不用的请耗子尾汁. + +# 架构 | Architecture + +![Architecture](https://iknow.hs.net/27fb40b8-22d4-45c2-92e0-1471112d5102.jpg) + + +# 相关链接 | Links + +- [Switch To English](https://gitee.com/easy-es/easy-es/blob/master/README_EN.md) +- [功能示例](https://gitee.com/dromara/easy-es/tree/master/easy-es-sample) +- [Springboot集成Demo](https://gitee.com/easy-es/easy-es-springboot-demo) + +# Latest Version: [![Maven Central](https://img.shields.io/github/v/release/xpc1024/easy-es?include_prereleases&logo=xpc&style=plastic)](https://search.maven.org/search?q=g:io.github.xpc1024%20a:easy-*) +--- +**Maven:** +``` xml + + org.dromara.easy-es + easy-es-boot-starter + Latest Version + +``` +**Gradle:** +```groovy +compile group: 'org.dromara.easy-es', name: 'easy-es-boot-starter', version: 'Latest Version' +``` + +# 荣誉 | Honour + +> Easy-Es是一个持续成长和精进的开源框架,感谢大家一路支持,也感谢多方平台多我们努力的认可,我们会继续努力,用更好的产品力回报每一位支持者! + + +zsxq + + +# 其他开源项目 | Other Project + +- [健身计划一键生成系统](https://gitee.com/easy-es/fit-plan) + +# 期望 | Futures +--- + +> 欢迎提出更好的意见,帮助完善 Easy-Es + +# 版权 | License +--- + +[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) + +# 关注我 | About Me + +[CSDN博客](https://blog.csdn.net/lovexiaotaozi?spm=3001.5343) + +QQ | 微信:252645816 + +# 知识星球 | Planet Of Knowledge + +zsxq + +# 捐赠 | Donate + + +[捐赠记录,感谢你们的支持!](https://easy-es.cn/pages/b52ac5/) + +> 您的支持是鼓励我们前行的动力,无论金额多少都足够表达您这份心意。 + +> 如果您愿意捐赠本项目,推荐直接在右下方通过Gitee直接捐赠. + +# 广告商 | Advertising provider + +> 我们的广告投放商,如果您期望Easy-Es能够走得更远,不妨点击下图,支持一下我们的广告商Thanks♪(・ω・)ノ + + + ad + + +
+ + + ad + + + +# 赞助商 | Sponsor + +> 如果您想支持我们,奈何囊中羞涩,没事,您可以花30秒借花献佛,点击下方链接进入注册,则该赞助商会代您捐赠一笔小钱给社区开发者们买包辣条。 + + + ad + + + +# 周边好物 | Good things + + +> 老汉为社区量身打造的专属T恤,感兴趣的老板们可以点击下图链接了解详情 + + + ad + + +
+ ad From ed95bb9bfd467061914f2ee2bc1b37b09464dd4c Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Mon, 20 Nov 2023 15:55:49 +0800 Subject: [PATCH 02/12] Update README.md --- README.md | 396 +----------------------------------------------------- 1 file changed, 5 insertions(+), 391 deletions(-) diff --git a/README.md b/README.md index 167d65a..2f74d4b 100644 --- a/README.md +++ b/README.md @@ -57,194 +57,6 @@ Easy-Es is a powerfully enhanced toolkit of RestHighLevelClient for simplify dev -```java - -// Use Easy-Es to complete the query with only 1 lines of code -List documents = documentMapper.selectList(EsWrappers.lambdaQuery(Document.class).eq(Document::getTitle, "Hi").eq(Document::getCreator, "Guy")); -``` - -```java -// Query with RestHighLevelClient requires 11 lines of code, not including parsing JSON code -String indexName = "document"; - SearchRequest searchRequest = new SearchRequest(indexName); - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - TermQueryBuilder titleTerm = QueryBuilders.termQuery("title", "Hi"); - TermsQueryBuilder creatorTerm = QueryBuilders.termsQuery("creator", "Guy"); - boolQueryBuilder.must(titleTerm); - boolQueryBuilder.must(creatorTerm); - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(boolQueryBuilder); - searchRequest.source(searchSourceBuilder); - try { - SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); - // Then parse the DocumentList from searchResponse in various ways, omitting these codes... - } catch (IOException e) { - e.printStackTrace(); - } -``` - -> The above is just a simple query demonstration. The more complex the actual query scene, the better the effect, which can save 3-5 times the amount of code on average. -## Getting started - -- Latest Version: [![Maven Central](https://img.shields.io/github/v/release/xpc1024/easy-es?include_prereleases&logo=xpc&style=plastic)](https://search.maven.org/search?q=g:io.github.xpc1024%20a:easy-*) - -- Add Easy-Es dependency - - - Maven: - ```xml - - org.dromara.easy-es - easy-es-boot-starter - Latest Version - - ``` - - Gradle - ```groovy - compile group: 'org.dromara.easy-es', name: 'easy-es-boot-starter', version: 'Latest Version' - ``` -- Add mapper file extends BaseEsMapper interface - - ```java - public interface DocumentMapper extends BaseMapper { - } - ``` - -- Use it - ``` java - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getTitle,"Hello World") - .eq(Document::getCreator,"Guy"); - List documentList = documentMapper.selectList(); - - ``` - Easy-Es will execute the following Query: - ```json - {"query":{"bool":{"must":[{"term":{"title":{"value":"Hello World","boost":1.0}}},{"term":{"creator":{"value":"Guy","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}}} - ``` - - The syntax of this query in MySQL is: - ```sql - SELECT * FROM document WHERE title = 'Hello World' AND creator = 'Guy' - ``` - -> This showcase is just a small part of Easy-Es features. If you want to learn more, please refer to the [documentation](https://easy-es.cn/#/en/). - -## Architecture - -![Architecture](https://iknow.hs.net/27fb40b8-22d4-45c2-92e0-1471112d5102.jpg) - -## MySQL Easy-Es and Es syntax comparison table - - -| MySQL | Easy-Es | Es-DSL/Es java api| -| --- | --- |--- | -| and | and |must| -| or | or | should| -| = | eq | term| -| != | ne | boolQueryBuilder.mustNot(queryBuilder)| -| > | gt | QueryBuilders.rangeQuery('es field').gt()| -| >= | ge | .rangeQuery('es field').gte()| -| < | lt | .rangeQuery('es field').lt() | -| <= | le | .rangeQuery('es field').lte()| -| like '%field%' | like | QueryBuilders.wildcardQuery(field,*value*)| -| not like '%field%' | notLike | must not wildcardQuery(field,*value*)| -| like '%field' | likeLeft | QueryBuilders.wildcardQuery(field,*value)| -| like 'field%' | likeRight | QueryBuilders.wildcardQuery(field,value*)| -| between | between | QueryBuilders.rangeQuery('es field').from(xx).to(xx) | -| notBetween | notBetween | must not QueryBuilders.rangeQuery('es field').from(xx).to(xx)| -| is null | isNull | must not QueryBuilders.existsQuery(field) | -| is notNull | isNotNull | QueryBuilders.existsQuery(field)| -| in | in | QueryBuilders.termsQuery(" xx es field", xx)| -| not in | notIn | must not QueryBuilders.termsQuery(" xx es field", xx)| -| group by | groupBy | AggregationBuilders.terms()| -| order by | orderBy | fieldSortBuilder.order(ASC/DESC)| -| min | min | AggregationBuilders.min| -| max | max |AggregationBuilders.max| -| avg | avg |AggregationBuilders.avg| -| sum | sum |AggregationBuilders.sum| -| order by xxx asc | orderByAsc | fieldSortBuilder.order(SortOrder.ASC)| -| order by xxx desc | orderByDesc |fieldSortBuilder.order(SortOrder.DESC)| -| - | match |matchQuery| -| - | matchPhrase |QueryBuilders.matchPhraseQuery| -| - | matchPrefix |QueryBuilders.matchPhrasePrefixQuery| -| - | queryStringQuery |QueryBuilders.queryStringQuery| -| select * | matchAllQuery |QueryBuilders.matchAllQuery()| -| - | highLight |HighlightBuilder.Field | -| ... | ... | ...| - -## Advertising provider - - ad - - -## Donate - -[Donate Easy-Es](https://en.easy-es.cn/pages/fb291d/) - - -## License - -Easy-Es is under the Apache 2.0 license. See the [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) file for details. -

- - East-Es-Logo - -

- -

- Born To Simplify Development -

- -

- - maven - - - - code style - -

- -## What is Easy-Es? - -Easy-Es is a powerfully enhanced toolkit of RestHighLevelClient for simplify development. This toolkit provides some efficient, useful, out-of-the-box features for ElasticSearch. By using Easy-Es, you can use MySQL syntax to complete Es queries. Use it can effectively save your development time. - -## Official website - -**easy-es website** https://en.easy-es.cn/ - -**easy-es gitee** https://gitee.com/dromara/easy-es - -**easy-es github** https://github.com/dromara/easy-es - -**dromara website** https://dromara.org/ - -**dromara gitee homepage** https://gitee.com/dromara/ - -## Links - -- [中文版](https://github.com/xpc1024/easy-es/blob/main/README-ZH.md) -- [Samples](https://github.com/xpc1024/easy-es/tree/main/easy-es-sample) -- [Demo in Springboot](https://en.easy-es.cn/pages/658abb/#_2-pom) - -## Features - -- Automatically create and update indexes, automatically migrate data, and process zero downtime -- Auto configuration on startup -- Out-of-the-box interfaces for operate es -- Powerful and flexible where condition wrapper -- Lambda-style API -- Automatic paging operation -- Support high-level syntax such as highlighting and weighting and Geo etc -- ... - -## Compare - -> Demand: Query all documents with title equals "Hi" and author equals "Guy" - - - ```java // Use Easy-Es to complete the query with only 3 lines of code LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); @@ -275,10 +87,8 @@ String indexName = "document"; > The above is just a simple query demonstration. The more complex the actual query scene, the better the effect, which can save 3-5 times the amount of code on average. ## Getting started -- Latest Version: [![Maven Central](https://img.shields.io/github/v/release/xpc1024/easy-es?include_prereleases&logo=xpc&style=plastic)](https://search.maven.org/search?q=g:io.github.xpc1024%20a:easy-*) - -- Add Easy-Es dependency - +- Add Easy-Es dependency + - Latest Version: [![Maven Central](https://img.shields.io/github/v/release/xpc1024/easy-es?include_prereleases&logo=xpc&style=plastic)](https://search.maven.org/search?q=g:io.github.xpc1024%20a:easy-*) - Maven: ```xml @@ -324,7 +134,6 @@ String indexName = "document"; ## MySQL Easy-Es and Es syntax comparison table - | MySQL | Easy-Es | Es-DSL/Es java api| | --- | --- |--- | | and | and |must| @@ -360,205 +169,9 @@ String indexName = "document"; | select * | matchAllQuery |QueryBuilders.matchAllQuery()| | - | highLight |HighlightBuilder.Field | | ... | ... | ...| - -## Advertising provider -

- - East-Es-Logo - -

- -

- 您的Star是我继续前进的动力,如果喜欢EE请右上角帮忙点亮星星⭐! -

- -

- - maven - - - - code style - -

- -# 官方地址 | Official website - -**easy-es官网** https://easy-es.cn/ - -**easy-es官方gitee** https://gitee.com/dromara/easy-es - -**easy-es官方github** https://github.com/dromara/easy-es - -**开源社区dromara** https://dromara.org/ - -**开源社区码云首页** https://gitee.com/dromara/ - -> **Tip:** 官网是vue单页面应用,首次访问加载可能比较慢🐢,主公们请耐心等待一下,后续会很快🏹,如偶遇打不开可刷新多尝试几次. - -# 简介 | Intro - -Easy-Es是一款简化ElasticSearch搜索引擎操作的开源框架,全自动智能索引托管. - -目前功能丰富度和易用度及性能已全面领先SpringData-Elasticsearch. - -简化`CRUD`及其它高阶操作,可以更好的帮助开发者减轻开发负担 - -底层采用Es官方提供的RestHighLevelClient,保证其原生性能及拓展性. - -技术讨论 QQ 群 :729148550 群内可在群文件中免费领取 颈椎保护 | 增肌 | 减脂 等健身计划 无套路 - -微信群请先添加作者微信,由作者拉入 (亦可咨询健身问题,作者是健身教练) - -项目推广初期,还望大家能够不吝点点三连:⭐Star,👀Watch,fork📌 - -支持一下国产开源,让更多人看到和使用本项目,非常感谢! - -# 优点 | Advantages - -- **全自动索引托管:** 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者 -- **智能字段类型推断:** 根据索引类型和当前查询类型上下文综合智能判断当前查询是否需要拼接.keyword后缀,减少小白误用的可能 -- **屏蔽语言差异:** 开发者只需要会MySQL语法即可使用Es -- **代码量极少:** 与直接使用RestHighLevelClient相比,相同的查询平均可以节3-8倍左右的代码量 -- **零魔法值:** 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值 -- **零额外学习成本:** 开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至Easy-Es -- **降低开发者门槛:** 即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发 -- **功能强大:** 支持MySQL的几乎全部功能,且对ES特有的分词,权重,高亮,嵌套,地理位置Geo,Ip地址查询等功能都支持 -- **语法优雅:** 所有条件构造器均支持Lambda风格链式编程,编程体验和代码可读性大幅提升 -- **安全可靠:** 墨菲安全扫描零风险,且代码单元测试综合覆盖率高达95%以上. -- **完善的中英文文档:** 提供了中英文双语操作文档,文档全面可靠,帮助您节省更多时间 -- **...** - -# 对比 | Compare - -> 需求:查询出文档标题为 "传统功夫"且作者为"码保国"的所有文档 -```java - // 使用Easy-Es仅需1行代码即可完成查询 - List documents = documentMapper.selectList(EsWrappers.lambdaQuery(Document.class).eq(Document::getTitle, "传统功夫").eq(Document::getCreator, "码保国")); -``` - - -```java - // 传统方式, 直接用RestHighLevelClient进行查询 需要19行代码,还不包含下划线转驼峰,自定义字段处理及_id处理等代码 - String indexName = "document"; - SearchRequest searchRequest = new SearchRequest(indexName); - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - TermQueryBuilder titleTerm = QueryBuilders.termQuery("title", "传统功夫"); - TermsQueryBuilder creatorTerm = QueryBuilders.termsQuery("creator", "码保国"); - boolQueryBuilder.must(titleTerm); - boolQueryBuilder.must(creatorTerm); - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(boolQueryBuilder); - searchRequest.source(searchSourceBuilder); - try { - SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); - List documents = Optional.ofNullable(searchResponse) - .map(SearchResponse::getHits) - .map(SearchHits::getHits) - .map(hit->Document document = JSON.parseObject(hit.getSourceAsString(),Document.class)) - .collect(Collectors.toList()); - } catch (IOException e) { - e.printStackTrace(); - } -``` -> * 以上只是简单查询演示,实际使用场景越复杂,效果就越好,平均可节省至少3-8倍代码量 -> * 传统功夫,点到为止! 上述功能仅供演示,仅为Easy-Es支持功能的冰山一角,Easy-Es就是这么Easy到不讲武德💪,不用的请耗子尾汁. - -# 架构 | Architecture - -![Architecture](https://iknow.hs.net/27fb40b8-22d4-45c2-92e0-1471112d5102.jpg) - - -# 相关链接 | Links - -- [Switch To English](https://gitee.com/easy-es/easy-es/blob/master/README_EN.md) -- [功能示例](https://gitee.com/dromara/easy-es/tree/master/easy-es-sample) -- [Springboot集成Demo](https://gitee.com/easy-es/easy-es-springboot-demo) - -# Latest Version: [![Maven Central](https://img.shields.io/github/v/release/xpc1024/easy-es?include_prereleases&logo=xpc&style=plastic)](https://search.maven.org/search?q=g:io.github.xpc1024%20a:easy-*) ---- -**Maven:** -``` xml - - org.dromara.easy-es - easy-es-boot-starter - Latest Version - -``` -**Gradle:** -```groovy -compile group: 'org.dromara.easy-es', name: 'easy-es-boot-starter', version: 'Latest Version' -``` - -# 荣誉 | Honour - -> Easy-Es是一个持续成长和精进的开源框架,感谢大家一路支持,也感谢多方平台多我们努力的认可,我们会继续努力,用更好的产品力回报每一位支持者! - - -zsxq - - -# 其他开源项目 | Other Project - -- [健身计划一键生成系统](https://gitee.com/easy-es/fit-plan) - -# 期望 | Futures --- -> 欢迎提出更好的意见,帮助完善 Easy-Es - -# 版权 | License ---- - -[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) - -# 关注我 | About Me - -[CSDN博客](https://blog.csdn.net/lovexiaotaozi?spm=3001.5343) - -QQ | 微信:252645816 - -# 知识星球 | Planet Of Knowledge - -zsxq - -# 捐赠 | Donate - - -[捐赠记录,感谢你们的支持!](https://easy-es.cn/pages/b52ac5/) - -> 您的支持是鼓励我们前行的动力,无论金额多少都足够表达您这份心意。 - -> 如果您愿意捐赠本项目,推荐直接在右下方通过Gitee直接捐赠. - -# 广告商 | Advertising provider - -> 我们的广告投放商,如果您期望Easy-Es能够走得更远,不妨点击下图,支持一下我们的广告商Thanks♪(・ω・)ノ - - - ad - - -
- - - ad - - - -# 赞助商 | Sponsor - -> 如果您想支持我们,奈何囊中羞涩,没事,您可以花30秒借花献佛,点击下方链接进入注册,则该赞助商会代您捐赠一笔小钱给社区开发者们买包辣条。 - - - ad - - - -# 周边好物 | Good things - - -> 老汉为社区量身打造的专属T恤,感兴趣的老板们可以点击下图链接了解详情 +## Advertising provider ad @@ -566,11 +179,12 @@ QQ | 微信:252645816
-
ad + ## Donate [Donate Easy-Es](https://en.easy-es.cn/pages/fb291d/) From a139fefe4b93eb412a446f9c003792e91549c879 Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Tue, 21 Nov 2023 11:52:13 +0800 Subject: [PATCH 03/12] Update README-ZH.md --- README-ZH.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README-ZH.md b/README-ZH.md index efbc8c0..74b6095 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -171,6 +171,12 @@ QQ | 微信:252645816 > 我们的广告投放商,如果您期望Easy-Es能够走得更远,不妨点击下图,支持一下我们的广告商Thanks♪(・ω・)ノ + + ad + + +
+ ad From 8f00a95dcd74ad8339ec0bcdb7843823954d91d8 Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Tue, 21 Nov 2023 11:52:40 +0800 Subject: [PATCH 04/12] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 2f74d4b..c25a3fd 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,12 @@ String indexName = "document"; ## Advertising provider + + ad + + +
+ ad From e3e64daf63299d6ac47d6ab2f831e58c4c7ea182 Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:26:10 +0800 Subject: [PATCH 05/12] Update README.md --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c25a3fd..dfaee2c 100644 --- a/README.md +++ b/README.md @@ -173,8 +173,9 @@ String indexName = "document"; ## Advertising provider - - ad + + ad
@@ -185,12 +186,10 @@ String indexName = "document";
- - ad + + ad - ## Donate [Donate Easy-Es](https://en.easy-es.cn/pages/fb291d/) From a3ae2a050efdff7c0bfc3485ecf6dcf7e12fd52c Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:28:32 +0800 Subject: [PATCH 06/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dfaee2c..eb897a1 100644 --- a/README.md +++ b/README.md @@ -187,7 +187,7 @@ String indexName = "document";
- ad + ad ## Donate From 2efe0ca2768ba555f525c4828bb26e1d69e1ee5f Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:29:45 +0800 Subject: [PATCH 07/12] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index eb897a1..e0d55b0 100644 --- a/README.md +++ b/README.md @@ -180,12 +180,15 @@ String indexName = "document";
+ ad +
+ ad From 39ac6750fccc70d4cb67aaa459c99e8472309403 Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:31:53 +0800 Subject: [PATCH 08/12] Update README-ZH.md --- README-ZH.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README-ZH.md b/README-ZH.md index 74b6095..abf83b3 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -171,8 +171,8 @@ QQ | 微信:252645816 > 我们的广告投放商,如果您期望Easy-Es能够走得更远,不妨点击下图,支持一下我们的广告商Thanks♪(・ω・)ノ - - ad + + ad
@@ -183,8 +183,8 @@ QQ | 微信:252645816
- - ad + + ad From 617bea1aa314cadef573111a8e455958b4fe67b9 Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Mon, 27 Nov 2023 14:23:00 +0800 Subject: [PATCH 09/12] Update README-ZH.md --- README-ZH.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README-ZH.md b/README-ZH.md index abf83b3..213414a 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -22,6 +22,8 @@ **easy-es官网** https://easy-es.cn/ +**easy-es备用官网** http://47.92.157.199 (国内用户如偶遇官网打不开,可访"无言"先生捐赠的此备用地址) + **easy-es官方gitee** https://gitee.com/dromara/easy-es **easy-es官方github** https://github.com/dromara/easy-es From dc3d753d90fbfb78f6df904c66ac019d4a58954f Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:31:09 +0800 Subject: [PATCH 10/12] Update README-ZH.md --- README-ZH.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README-ZH.md b/README-ZH.md index 213414a..944e966 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -57,7 +57,7 @@ Easy-Es是一款简化ElasticSearch搜索引擎操作的开源框架,全自动 - **全自动索引托管:** 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者 - **智能字段类型推断:** 根据索引类型和当前查询类型上下文综合智能判断当前查询是否需要拼接.keyword后缀,减少小白误用的可能 - **屏蔽语言差异:** 开发者只需要会MySQL语法即可使用Es -- **代码量极少:** 与直接使用RestHighLevelClient相比,相同的查询平均可以节3-8倍左右的代码量 +- **代码量极少:** 与直接使用RestHighLevelClient相比,相同的查询平均可以节3-80倍左右的代码量 - **零魔法值:** 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值 - **零额外学习成本:** 开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至Easy-Es - **降低开发者门槛:** 即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发 @@ -99,7 +99,7 @@ Easy-Es是一款简化ElasticSearch搜索引擎操作的开源框架,全自动 e.printStackTrace(); } ``` -> * 以上只是简单查询演示,实际使用场景越复杂,效果就越好,平均可节省至少3-8倍代码量 +> * 以上只是简单查询演示,实际使用场景越复杂,效果就越好,平均可节省至少3-80倍代码量 > * 传统功夫,点到为止! 上述功能仅供演示,仅为Easy-Es支持功能的冰山一角,Easy-Es就是这么Easy到不讲武德💪,不用的请耗子尾汁. # 架构 | Architecture From 2f3db80c6ef6fc9e0dca94351ca6f12deb0a940b Mon Sep 17 00:00:00 2001 From: elastic search <38153520+xpc1024@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:31:53 +0800 Subject: [PATCH 11/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0d55b0..63bdbf7 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ String indexName = "document"; } ``` -> The above is just a simple query demonstration. The more complex the actual query scene, the better the effect, which can save 3-5 times the amount of code on average. +> The above is just a simple query demonstration. The more complex the actual query scene, the better the effect, which can save 3-80 times the amount of code on average. ## Getting started - Add Easy-Es dependency From 50cc035e47fb59f4f09550107fa3aa24bd04fe92 Mon Sep 17 00:00:00 2001 From: wenzb <1751902289@qq.com> Date: Tue, 5 Mar 2024 16:45:25 +0800 Subject: [PATCH 12/12] =?UTF-8?q?feature=20#106=20interface=E6=94=AF?= =?UTF-8?q?=E6=8C=81default=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/register/MapperFactoryBean.java | 3 +- .../easyes/core/proxy/EsMapperProxy.java | 148 +- .../easyes/test/mapper/DocumentMapper.java | 10 + .../org/dromara/easyes/test/all/AllTest.java | 1797 ++++++++--------- .../src/test/resources/application.yml | 2 +- 5 files changed, 1038 insertions(+), 922 deletions(-) diff --git a/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java index 5a0df2b..0dcc2a8 100644 --- a/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java +++ b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java @@ -25,6 +25,7 @@ import java.lang.reflect.Proxy; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; /** * 代理类 @@ -56,7 +57,7 @@ public MapperFactoryBean(Class mapperInterface) { @Override public T getObject() throws Exception { - EsMapperProxy esMapperProxy = new EsMapperProxy<>(mapperInterface); + EsMapperProxy esMapperProxy = new EsMapperProxy<>(mapperInterface, new ConcurrentHashMap<>()); // 获取实体类 Class entityClass = TypeUtils.getInterfaceT(mapperInterface, 0); diff --git a/easy-es-core/src/main/java/org/dromara/easyes/core/proxy/EsMapperProxy.java b/easy-es-core/src/main/java/org/dromara/easyes/core/proxy/EsMapperProxy.java index 50c6d21..a9b04cb 100644 --- a/easy-es-core/src/main/java/org/dromara/easyes/core/proxy/EsMapperProxy.java +++ b/easy-es-core/src/main/java/org/dromara/easyes/core/proxy/EsMapperProxy.java @@ -4,8 +4,14 @@ import org.dromara.easyes.core.core.BaseEsMapperImpl; import java.io.Serializable; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Map; /** * 代理类 @@ -13,19 +19,131 @@ * Copyright © 2021 xpc1024 All Rights Reserved **/ public class EsMapperProxy implements InvocationHandler, Serializable { - private static final long serialVersionUID = 1L; - private Class mapperInterface; - - public EsMapperProxy(Class mapperInterface) { - this.mapperInterface = mapperInterface; - } - - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - BaseEsMapperImpl baseEsMapperInstance = BaseCache.getBaseEsMapperInstance(mapperInterface); - // 这里如果后续需要像MP那样 从xml生成代理的其它方法,则可增强method,此处并不需要 - return method.invoke(baseEsMapperInstance, args); - } - + + private static final long serialVersionUID = 1L; + + private static final int ALLOWED_MODES = + MethodHandles.Lookup.PRIVATE | MethodHandles.Lookup.PROTECTED | MethodHandles.Lookup.PACKAGE + | MethodHandles.Lookup.PUBLIC; + + private static final Method privateLookupInMethod; + + private static final Constructor lookupConstructor; + + static { + Method privateLookupIn; + try { + privateLookupIn = MethodHandles.class.getMethod("privateLookupIn", Class.class, MethodHandles.Lookup.class); + } catch (NoSuchMethodException e) { + privateLookupIn = null; + } + privateLookupInMethod = privateLookupIn; + + Constructor lookup = null; + if (privateLookupInMethod == null) { + // JDK 1.8 + try { + lookup = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class); + lookup.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new IllegalStateException( + "There is neither 'privateLookupIn(Class, Lookup)' nor 'Lookup(Class, int)' method in java.lang.invoke.MethodHandles.", + e); + } catch (Exception e) { + lookup = null; + } + } + lookupConstructor = lookup; + } + + private final Map methodCache; + + private Class mapperInterface; + + public EsMapperProxy(Class mapperInterface, Map methodCache) { + this.mapperInterface = mapperInterface; + this.methodCache = methodCache; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + BaseEsMapperImpl baseEsMapperInstance = BaseCache.getBaseEsMapperInstance(mapperInterface); + if (Object.class.equals(method.getDeclaringClass())) { + return method.invoke(baseEsMapperInstance, args); + } + // 这里如果后续需要像MP那样 从xml生成代理的其它方法,则可增强method,此处并不需要 + // 增强default方法 + return cachedInvoker(method, baseEsMapperInstance).invoke(proxy, method, args); + } + + private EsMapperMethodInvoker cachedInvoker(Method method, BaseEsMapperImpl baseEsMapperInstance) + throws Throwable { + try { + return methodCache.computeIfAbsent(method, m -> { + if (!m.isDefault()) { + return new PlainMethodInvoker(baseEsMapperInstance); + } + try { + if (privateLookupInMethod == null) { + return new DefaultMethodInvoker(getMethodHandleJava8(method)); + } + return new DefaultMethodInvoker(getMethodHandleJava9(method)); + } catch (IllegalAccessException | InstantiationException | InvocationTargetException | + NoSuchMethodException e) { + throw new RuntimeException(e); + } + }); + } catch (RuntimeException re) { + Throwable cause = re.getCause(); + throw cause == null ? re : cause; + } + } + + private MethodHandle getMethodHandleJava9(Method method) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + final Class declaringClass = method.getDeclaringClass(); + return ((MethodHandles.Lookup) privateLookupInMethod.invoke(null, declaringClass, + MethodHandles.lookup())).findSpecial(declaringClass, method.getName(), + MethodType.methodType(method.getReturnType(), method.getParameterTypes()), declaringClass); + } + + private MethodHandle getMethodHandleJava8(Method method) + throws IllegalAccessException, InstantiationException, InvocationTargetException { + final Class declaringClass = method.getDeclaringClass(); + return lookupConstructor.newInstance(declaringClass, ALLOWED_MODES).unreflectSpecial(method, declaringClass); + } + + interface EsMapperMethodInvoker { + + Object invoke(Object proxy, Method method, Object[] args) throws Throwable; + } + + private static class PlainMethodInvoker implements EsMapperMethodInvoker { + + private final BaseEsMapperImpl baseEsMapperInstance; + + public PlainMethodInvoker(BaseEsMapperImpl baseEsMapperInstance) { + this.baseEsMapperInstance = baseEsMapperInstance; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return method.invoke(baseEsMapperInstance, args); + } + } + + private static class DefaultMethodInvoker implements EsMapperMethodInvoker { + + private final MethodHandle methodHandle; + + public DefaultMethodInvoker(MethodHandle methodHandle) { + this.methodHandle = methodHandle; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return methodHandle.bindTo(proxy).invokeWithArguments(args); + } + } + } diff --git a/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java b/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java index c078d21..e9339c0 100644 --- a/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java +++ b/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java @@ -1,12 +1,22 @@ package org.dromara.easyes.test.mapper; +import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; import org.dromara.easyes.core.core.BaseEsMapper; +import org.dromara.easyes.core.core.EsWrappers; import org.dromara.easyes.test.entity.Document; +import java.util.List; + /** * mapper 相当于Mybatis-plus的mapper *

* Copyright © 2021 xpc1024 All Rights Reserved **/ public interface DocumentMapper extends BaseEsMapper { + + default List testDefaultMethod() { + LambdaEsQueryWrapper wrapper = EsWrappers.lambdaQuery(Document.class) + .eq(Document::getTitle, "测试文档4").match(Document::getContent, "内容"); + return selectList(wrapper); + } } diff --git a/easy-es-test/src/test/java/org/dromara/easyes/test/all/AllTest.java b/easy-es-test/src/test/java/org/dromara/easyes/test/all/AllTest.java index 5c0397e..8190dd0 100644 --- a/easy-es-test/src/test/java/org/dromara/easyes/test/all/AllTest.java +++ b/easy-es-test/src/test/java/org/dromara/easyes/test/all/AllTest.java @@ -34,21 +34,30 @@ 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.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +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.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import static org.dromara.easyes.common.constants.BaseEsConstants.KEYWORD_SUFFIX; /** - * 全部核心功能测试-除手动挡索引相关API - * 以下测试用例,需要开启自动挡 + * 全部核心功能测试-除手动挡索引相关API 以下测试用例,需要开启自动挡 *

* Copyright © 2022 xpc1024 All Rights Reserved **/ @@ -56,905 +65,883 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @SpringBootTest(classes = TestEasyEsApplication.class) public class AllTest { - @Resource - private DocumentMapper documentMapper; - - @Test - @Order(0) - public void testCreateIndex() { - // 0.前置操作 创建索引 需确保索引托管模式处于manual手动挡,若为自动挡则会冲突. - boolean success = documentMapper.createIndex(); - Assertions.assertTrue(success); - } - - // 1.新增 - @Test - @Order(1) - public void testInsert() { - // 测试插入数据 - Document document = new Document(); - document.setEsId("1"); - document.setCaseTest("Test"); - document.setTitle("测试文档1"); - document.setContent("测试内容1我是大家发达酸辣粉家里都是测试阿拉拉肥发的是就测试时风刀霜剑阿凯刘非打死了交付率及时点法律就反倒是测测试初拉力肌肥大来极氪吉利发送代理费逻辑逻辑发骚鸡,测试发力了哦哦我"); - document.setCreator("老汉1"); - document.setIpAddress("192.168.1.1"); - document.setLocation("40.171975,116.587105"); - document.setGmtCreate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - document.setCustomField("自定义字段1"); - document.setNullField("id为1的数据不是null,除此之外其它都是"); - Rectangle rectangle = new Rectangle(39.084509D, 41.187328D, 70.610461D, 20.498353D); - document.setGeoLocation(rectangle.toString()); - document.setStarNum(1); - document.setMultiField("葡萄糖酸钙口服溶液"); - document.setEnglish("Calcium Gluconate"); - document.setBigNum(new BigDecimal("66.66")); - int successCount = documentMapper.insert(document); - Assertions.assertEquals(successCount, 1); - } - - @Test - @Order(2) - public void testBatchInsert() { - List documentList = new ArrayList<>(); - for (int i = 2; i < 23; i++) { - Document document = new Document(); - document.setEsId(Integer.toString(i)); - document.setTitle("测试文档" + i); - document.setContent("测试内容" + i); - document.setCreator("老汉" + i); - document.setGmtCreate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - document.setCustomField("自定义字段" + i); - Point point = new Point(13.400544 + i, 52.530286 + i); - document.setGeoLocation(point.toString()); - document.setStarNum(i); - if (i == 2) { - document.setLocation("40.17836693398477,116.64002551005981"); - document.setStarNum(1); - } else if (i == 3) { - document.setLocation("40.19103839805197,116.5624013764374"); - } else if (i == 4) { - document.setLocation("40.13933715136454,116.63441990026217"); - } - documentList.add(document); - } - int count = documentMapper.insertBatch(documentList); - Assertions.assertEquals(documentList.size(), count); - } - - // 2.修改 - @Test - @Order(3) - public void testUpdateById() { - Document document = new Document(); - document.setEsId("1"); - document.setTitle("测试文档1标题被更新了"); - int count = documentMapper.updateById(document); - Assertions.assertEquals(1, count); - } - - @Test - @Order(4) - public void testUpdateByWrapper() { - LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); - wrapper.eq(Document::getTitle, "测试文档2"); - wrapper.set(Document::getContent, "测试文档内容2的内容被更新了"); - int count = documentMapper.update(null, wrapper); - Assertions.assertEquals(1, count); - } - - @Test - @Order(4) - public void testUpdateByChainWrapper() { - int count = EsWrappers.lambdaChainUpdate(documentMapper) - .eq(Document::getTitle, "测试文档3") - .set(Document::getContent, "测试文档内容3的内容被修改了") - .update(); - Assertions.assertEquals(1, count); - } - - @Test - @Order(4) - public void testUpdateBySetSearchSourceBuilder() { - LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(QueryBuilders.termQuery(FieldUtils.val(Document::getTitle) + KEYWORD_SUFFIX, "测试文档2")); - wrapper.setSearchSourceBuilder(searchSourceBuilder); - Document document = new Document(); - document.setContent("测试文档内容2的内容再次被更新了"); - int count = documentMapper.update(document, wrapper); - Assertions.assertEquals(1, count); - } - - @Test - @Order(5) - public void testUpdateByWrapperAndEntity() { - LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - Document document = new Document(); - document.setCustomField("被更新的自定义字段"); - int count = documentMapper.update(document, wrapper); - Assertions.assertEquals(22, count); - } - - // 3.查询 - - @Test - @Order(6) - public void testSQL() { - // 注意 sql中的from后面跟的是要被查询的索引名,也可以是索引别名(效果一样) 由于索引名可能会变,所以此处我采用别名ee_default_alias进行查询 - String sql = "select count(*) from ee_default_alias where star_num > 0"; - String jsonResult = documentMapper.executeSQL(sql); - System.out.println(jsonResult); - Assertions.assertNotNull(jsonResult); - } - - @Test - @Order(6) - public void testDSL() { - String dsl = "{\"query\":{\"bool\":{\"must\":[{\"term\":{\"title.keyword\":{\"value\":\"测试文档3\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}},\"track_total_hits\":2147483647,\"highlight\":{\"pre_tags\":[\"\"],\"post_tags\":[\"\"],\"fragment_size\":2,\"fields\":{\"content\":{\"type\":\"unified\"}}}}"; - String jsonResult = documentMapper.executeDSL(dsl); - System.out.println(jsonResult); - Assertions.assertNotNull(jsonResult); - } - - @Test - @Order(6) - public void testSelectOne() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "内容") - .orderByAsc(Document::getStarNum, Document::getEsId) - .limit(1); - Document document = documentMapper.selectOne(wrapper); - Assertions.assertEquals("测试文档1标题被更新了", document.getTitle()); - } - - @Test - @Order(6) - public void testOne() { - // 链式调用 - Document document = EsWrappers.lambdaChainQuery(documentMapper).eq(Document::getTitle, "测试文档3").one(); - Assertions.assertEquals(document.getContent(), "测试文档内容3的内容被修改了"); - } - - @Test - @Order(6) - public void testSelectById() { - Document document = documentMapper.selectById(1); - Assertions.assertEquals("1", document.getEsId()); - Assertions.assertEquals("老汉1", document.getCreator()); - } - - @Test - @Order(6) - public void testSelectBatchIds() { - List documents = documentMapper.selectBatchIds(Arrays.asList("1", "2")); - Assertions.assertEquals(2, documents.size()); - } - - @Test - @Order(6) - public void testSelectList() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCustomField, "字段"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testIgnoreCase() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getCaseTest, "test"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(1, documents.size()); - } - - @Test - @Order(6) - public void testIp() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getIpAddress, "192.168.0.0/16"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(documents.size(), 1); - } - - @Test - @Order(6) - public void testSelectCount() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCustomField, "字段"); - Long count = documentMapper.selectCount(wrapper); - Assertions.assertEquals(22L, count); - } - - @Test - @Order(6) - public void testSelectCountDistinct() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCustomField, "字段"); - wrapper.distinct(Document::getStarNum); - Long count = documentMapper.selectCount(wrapper, true); - Assertions.assertEquals(21L, count); - } - - @Test - @Order(6) - public void testConditionAllEq() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - Map map = new HashMap<>(); - map.put("title", "测试文档3"); - map.put("creator.keyword", "老汉3"); - map.put("starNum", 3); - wrapper.allEq(map); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(1, documents.size()); - Assertions.assertEquals("测试文档3", documents.get(0).getTitle()); - } - - @Test - @Order(6) - public void testConditionEq() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getTitle, "测试文档10"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(1, documents.size()); - Assertions.assertEquals("测试文档10", documents.get(0).getTitle()); - } - - @Test - @Order(6) - public void testConditionGt() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.gt(Document::getStarNum, 20); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(2, documents.size()); - } - - @Test - @Order(6) - public void testConditionGe() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.ge(Document::getStarNum, 20); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(3, documents.size()); - } - - @Test - @Order(6) - public void testConditionLt() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.lt(Document::getStarNum, 3); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(2, documents.size()); - } - - @Test - @Order(6) - public void testConditionLe() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.le(Document::getStarNum, 3); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(3, documents.size()); - } - - @Test - @Order(6) - public void testConditionBetween() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.between(Document::getStarNum, 1, 10); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(10, documents.size()); - } - - @Test - @Order(6) - public void testConditionLike() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.like(Document::getTitle, "试文档"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testConditionLikeLeft() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.likeLeft(Document::getTitle, "文档10"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(1, documents.size()); - } - - @Test - @Order(6) - public void testConditionLikeRight() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.likeRight(Document::getTitle, "测试文"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testConditionIsNotNull() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.isNotNull(Document::getNullField); - List documents = documentMapper.selectList(wrapper); - 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() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.in(Document::getEsId, "1", "2", "3"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(3, documents.size()); - - LambdaEsQueryWrapper wrapper1 = new LambdaEsQueryWrapper<>(); - wrapper1.in(Document::getStarNum, 7, 8); - List documents1 = documentMapper.selectList(wrapper1); - Assertions.assertEquals(2, documents1.size()); - } - - @Test - @Order(6) - public void testConditionGroupBy() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "测试") - .groupBy(Document::getStarNum); - SearchResponse response = documentMapper.search(wrapper); - ParsedLongTerms parsedLongTerms = response.getAggregations() - .get("starNumTerms"); - Terms.Bucket bucket = parsedLongTerms.getBuckets().get(0); - Assertions.assertTrue(bucket.getKey().equals(1L) && bucket.getDocCount() == 2L); - } - - @Test - @Order(6) - public void testConditionMax() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "测试") - .max(Document::getStarNum); - SearchResponse response = documentMapper.search(wrapper); - ParsedMax parsedMax = response.getAggregations() - .get("starNumMax"); - Assertions.assertTrue(parsedMax.getValue() > 21); - } - - @Test - @Order(6) - public void testConditionMin() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "测试") - .min(Document::getStarNum); - SearchResponse response = documentMapper.search(wrapper); - ParsedMin parsedMin = response.getAggregations() - .get("starNumMin"); - Assertions.assertTrue(parsedMin.getValue() > 0 && parsedMin.getValue() < 2); - } - - @Test - @Order(6) - public void testConditionSum() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "测试") - .sum(Document::getStarNum); - SearchResponse response = documentMapper.search(wrapper); - ParsedSum parsedSum = response.getAggregations() - .get("starNumSum"); - Assertions.assertTrue(parsedSum.getValue() >= 252); - } - - - @Test - @Order(6) - public void testConditionAvg() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "测试") - .avg(Document::getStarNum); - SearchResponse response = documentMapper.search(wrapper); - ParsedAvg parsedAvg = response.getAggregations() - .get("starNumAvg"); - Assertions.assertTrue(parsedAvg.getValue() > 11 && parsedAvg.getValue() < 12); - } - - - @Test - @Order(6) - public void testConditionDistinct() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "测试") - .distinct(Document::getStarNum); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(21, documents.size()); - } - - @Test - @Order(6) - public void testConditionLimit() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉") - .limit(2, 5); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(5, documents.size()); - } - - @Test - @Order(6) - public void testConditionFromAndSize() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉") - .from(20) - .size(2); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(2, documents.size()); - } - - @Test - @Order(6) - public void testConditionIndex() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉") - .index(EntityInfoHelper.getEntityInfo(Document.class).getIndexName()); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testSetSearchSourceBuilder() { - // 测试混合查询的另一种方式 - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(QueryBuilders.matchQuery(FieldUtils.val(Document::getCreator), "老汉")); - Optional.ofNullable(EntityInfoHelper.getEntityInfo(Document.class)) - .flatMap(i -> Optional.ofNullable(i.getMaxResultWindow())) - .ifPresent(searchSourceBuilder::size); - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.setSearchSourceBuilder(searchSourceBuilder); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testConditionAnd() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.in(Document::getStarNum, 1, 2, 3, 4, 10, 11) - .and(w -> w.eq(Document::getTitle, "测试文档10").match(Document::getCreator, "老汉")); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(1, documents.size()); - } - - @Test - @Order(6) - public void testConditionOr() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.in(Document::getStarNum, 1, 10, 12, 13) - .or(i -> i.eq(Document::getTitle, "测试文档11").eq(Document::getTitle, "测试文档10")); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(5, documents.size()); - } - - @Test - @Order(6) - public void testConditionOrInner() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getTitle, "测试文档10") - .or() - .eq(Document::getTitle, "测试文档20"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(2, documents.size()); - } - - @Test - @Order(6) - public void testConditionFilter() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getStarNum, 10) - .filter().eq(Document::getTitle, "测试文档10"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(1, documents.size()); - } - - @Test - @Order(6) - public void testConditionNot() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.in(Document::getStarNum, 10, 11, 12, 13) - .and(i -> i.not().eq(Document::getTitle, "测试文档10").not().eq(Document::getTitle, "测试文档11")); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(2, documents.size()); - } - - - @Test - @Order(6) - public void testPageQuery() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - EsPageInfo pageInfo = documentMapper.pageQuery(wrapper, 1, 5); - Assertions.assertEquals(5, pageInfo.getSize()); - Assertions.assertEquals(22, pageInfo.getTotal()); - } - - @Test - @Order(6) - public void testChainPage() { - // 链式 - EsPageInfo pageInfo = EsWrappers.lambdaChainQuery(documentMapper) - .match(Document::getCreator, "老汉") - .page(1, 5); - Assertions.assertEquals(5, pageInfo.getSize()); - Assertions.assertEquals(22, pageInfo.getTotal()); - } - - - @Test - @Order(6) - public void testSearchAfter() { - LambdaEsQueryWrapper lambdaEsQueryWrapper = EsWrappers.lambdaQuery(Document.class); - lambdaEsQueryWrapper.size(10); - lambdaEsQueryWrapper.orderByDesc(Document::getEsId, Document::getStarNum); - SAPageInfo saPageInfo = documentMapper.searchAfterPage(lambdaEsQueryWrapper, null, 10); - //第一页 - System.out.println(saPageInfo); - Assertions.assertEquals(10, saPageInfo.getList().size()); - - //获取下一页 - List nextSearchAfter = saPageInfo.getNextSearchAfter(); - SAPageInfo next = documentMapper.searchAfterPage(lambdaEsQueryWrapper, nextSearchAfter, 10); - Assertions.assertEquals(10, next.getList().size()); - } - - @Test - @Order(6) - public void testFilterField() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getTitle, "测试文档10") - .select(Document::getEsId, Document::getContent); - Document document = documentMapper.selectOne(wrapper); - Assertions.assertNotNull(document.getContent()); - Assertions.assertNotNull(document.getEsId()); - Assertions.assertNull(document.getTitle()); - } - - @Test - @Order(6) - public void testNotFilterField() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq(Document::getTitle, "测试文档10") - .notSelect(Document::getEsId, Document::getContent); - Document document = documentMapper.selectOne(wrapper); - Assertions.assertNull(document.getContent()); - Assertions.assertNull(document.getEsId()); - Assertions.assertNotNull(document.getTitle()); - } - - @Test - @Order(6) - public void testOrderByDesc() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - wrapper.orderByDesc(Document::getStarNum); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("22", documents.get(0).getEsId()); - Assertions.assertEquals("21", documents.get(1).getEsId()); - } - - @Test - @Order(6) - public void testOrderByAsc() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - wrapper.orderByAsc(Document::getStarNum, Document::getEsId); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("1", documents.get(0).getEsId()); - Assertions.assertEquals("22", documents.get(21).getEsId()); - } - - @Test - @Order(6) - public void testOrderBy() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - List orderByParams = new ArrayList<>(); - OrderByParam orderByParam = new OrderByParam(); - orderByParam.setOrder("star_num"); - orderByParam.setSort("DESC"); - orderByParams.add(orderByParam); - wrapper.orderBy(orderByParams); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("22", documents.get(0).getEsId()); - Assertions.assertEquals("21", documents.get(1).getEsId()); - } - - @Test - @Order(6) - public void testOrderByDistanceAsc() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - GeoPoint centerPoint = new GeoPoint(41.0, 116.0); - wrapper.match(Document::getCreator, "老汉") - .geoDistance(Document::getLocation, 168.8, centerPoint) - .orderByDistanceAsc(Document::getLocation, centerPoint); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("3", documents.get(0).getEsId()); - Assertions.assertEquals("4", documents.get(3).getEsId()); - } - - @Test - @Order(6) - public void testOrderByDistanceDesc() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - GeoPoint centerPoint = new GeoPoint(41.0, 116.0); - wrapper.match(Document::getCreator, "老汉") - .geoDistance(Document::getLocation, 168.8, centerPoint) - .orderByDistanceDesc(Document::getLocation, centerPoint); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("4", documents.get(0).getEsId()); - Assertions.assertEquals("3", documents.get(3).getEsId()); - } - - @Test - @Order(6) - public void testOrderByDistanceMulti() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - GeoPoint centerPoint = new GeoPoint(41.0, 116.0); - GeoPoint centerPoint1 = new GeoPoint(42.0, 118.0); - wrapper.match(Document::getCreator, "老汉") - .geoDistance(Document::getLocation, 168.8, centerPoint) - .orderByDistanceDesc(Document::getLocation, centerPoint) - .orderByDistanceDesc(Document::getLocation, centerPoint1); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("4", documents.get(0).getEsId()); - Assertions.assertEquals("3", documents.get(3).getEsId()); - } - - @Test - @Order(6) - public void testSortByScore() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉11"); - wrapper.sortByScore(); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("11", documents.get(0).getEsId()); - } - - @Test - @Order(6) - public void testSort() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - FieldSortBuilder fieldSortBuilder = SortBuilders. - fieldSort(FieldUtils.getRealField( - FieldUtils.val(Document::getStarNum), - EntityInfoHelper.getEntityInfo(Document.class).getMappingColumnMap())); - fieldSortBuilder.order(SortOrder.DESC); - wrapper.sort(fieldSortBuilder); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals("22", documents.get(0).getEsId()); - Assertions.assertEquals("21", documents.get(1).getEsId()); - } - - @Test - @Order(6) - public void testMatch() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testMatchPhrase() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.matchPhrase(Document::getContent, "测试"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertTrue(documents.size() > 0); - - LambdaEsQueryWrapper wrapper1 = new LambdaEsQueryWrapper<>(); - wrapper1.matchPhrase(Document::getContent, "内容测试"); - List documents1 = documentMapper.selectList(wrapper1); - Assertions.assertTrue(documents1.size() <= 0); - } - - @Test - @Order(6) - public void testMatchAllQuery() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.matchAllQuery(); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testMatchPhrasePrefixQuery() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.matchPhrasePrefixQuery(Document::getContent, "测试"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testMultiMatchQuery() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.multiMatchQuery("老汉", Document::getContent, Document::getCreator, Document::getCustomField); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - - LambdaEsQueryWrapper wrapper1 = new LambdaEsQueryWrapper<>(); - wrapper1.multiMatchQuery("更新", Document::getContent, Document::getCreator); - List documents1 = documentMapper.selectList(wrapper1); - Assertions.assertEquals(1, documents1.size()); - } - - @Test - @Order(6) - public void testQueryStringQuery() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.queryStringQuery("老汉"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testPrefixQuery() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.prefixQuery(Document::getContent, "测试"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testHighLight() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getContent, "测试"); - List documents = documentMapper.selectList(wrapper); - Assertions.assertTrue(documents.get(0).getHighlightContent().contains("测试")); - } - - @Test - @Order(6) - public void testGeoBoundingBox() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - GeoPoint leftTop = new GeoPoint(41.187328D, 115.498353D); - GeoPoint bottomRight = new GeoPoint(39.084509D, 117.610461D); - wrapper.geoBoundingBox(Document::getLocation, leftTop, bottomRight); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(4, documents.size()); - } - - - @Test - @Order(6) - public void testGeoDistance() { - 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); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(4, documents.size()); - } - - @Test - @Order(6) - public void testGeoPolygon() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - List geoPoints = new ArrayList<>(); - GeoPoint geoPoint = new GeoPoint(40.178012, 116.577188); - GeoPoint geoPoint1 = new GeoPoint(40.169329, 116.586315); - GeoPoint geoPoint2 = new GeoPoint(40.178288, 116.591813); - geoPoints.add(geoPoint); - geoPoints.add(geoPoint1); - geoPoints.add(geoPoint2); - wrapper.geoPolygon(Document::getLocation, geoPoints); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(1, documents.size()); - } - - @Test - @Order(6) - public void testGeoShape() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - Circle circle = new Circle(13, 14, 100); - wrapper.geoShape(Document::getGeoLocation, circle, ShapeRelation.DISJOINT); - List documents = documentMapper.selectList(wrapper); - Assertions.assertEquals(22, documents.size()); - } - - @Test - @Order(6) - public void testMultiFieldSelect() { - // 药品 中文名叫葡萄糖酸钙口服溶液 英文名叫 Calcium Gluconate 汉语拼音为 putaotangsuangaikoufurongye - // 用户可以通过模糊检索,例如输入 Calcium 或 葡萄糖 或 putaotang时对应药品均可以被检索到 - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match("english", "Calcium") - .or() - .match("multi_field.zh", "葡萄糖") - .or() - .match("multi_field.pinyin", "putaotang"); - List documents = documentMapper.selectList(wrapper); - System.out.println(documents); - } - - // 4.删除 - @Test - @Order(7) - public void testDeleteById() { - int count = documentMapper.deleteById("1"); - Assertions.assertEquals(1, count); - } - - @Test - @Order(8) - public void testDeleteBatchIds() { - List idList = Arrays.asList("2", "3", "4"); - int count = documentMapper.deleteBatchIds(idList); - Assertions.assertEquals(3, count); - } - - @Test - @Order(9) - public void testDeleteByWrapper() { - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.match(Document::getCreator, "老汉"); - int count = documentMapper.delete(wrapper); - Assertions.assertEquals(18, count); - } - - @Test - @Order(10) - public void testDeleteIndex() { - boolean deleted = documentMapper.deleteIndex(EntityInfoHelper.getEntityInfo(Document.class).getIndexName()); - boolean lockDeleted = documentMapper.deleteIndex(BaseEsConstants.LOCK_INDEX); - Assertions.assertTrue(deleted); - Assertions.assertTrue(lockDeleted); - } - - @Test - @Order(9) - public void testComplex() { - // SQL写法 - // where business_type = 1 and (state = 9 or (state = 8 and bidding_sign = 1)) or (business_type = 2 and state in (2,3)) - - // RestHighLevelClient写法 - 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); - System.out.println("--------------------"); - - // MP及EE写法 - LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); - wrapper.eq("business_type", 1) - .and(a -> a.eq("state", 9).or(b -> b.eq("state", 8).eq("bidding_sign", 1))) - .or(i -> i.eq("business_type", 2).in("state", 2, 3)); - documentMapper.selectList(wrapper); - } - + + @Resource + private DocumentMapper documentMapper; + + @Test + @Order(0) + public void testCreateIndex() { + // 0.前置操作 创建索引 需确保索引托管模式处于manual手动挡,若为自动挡则会冲突. + boolean success = documentMapper.createIndex(); + Assertions.assertTrue(success); + } + + // 1.新增 + @Test + @Order(1) + public void testInsert() { + // 测试插入数据 + Document document = new Document(); + document.setEsId("1"); + document.setCaseTest("Test"); + document.setTitle("测试文档1"); + document.setContent( + "测试内容1我是大家发达酸辣粉家里都是测试阿拉拉肥发的是就测试时风刀霜剑阿凯刘非打死了交付率及时点法律就反倒是测测试初拉力肌肥大来极氪吉利发送代理费逻辑逻辑发骚鸡,测试发力了哦哦我"); + document.setCreator("老汉1"); + document.setIpAddress("192.168.1.1"); + document.setLocation("40.171975,116.587105"); + document.setGmtCreate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + document.setCustomField("自定义字段1"); + document.setNullField("id为1的数据不是null,除此之外其它都是"); + Rectangle rectangle = new Rectangle(39.084509D, 41.187328D, 70.610461D, 20.498353D); + document.setGeoLocation(rectangle.toString()); + document.setStarNum(1); + document.setMultiField("葡萄糖酸钙口服溶液"); + document.setEnglish("Calcium Gluconate"); + document.setBigNum(new BigDecimal("66.66")); + int successCount = documentMapper.insert(document); + Assertions.assertEquals(successCount, 1); + } + + @Test + @Order(2) + public void testBatchInsert() { + List documentList = new ArrayList<>(); + for (int i = 2; i < 23; i++) { + Document document = new Document(); + document.setEsId(Integer.toString(i)); + document.setTitle("测试文档" + i); + document.setContent("测试内容" + i); + document.setCreator("老汉" + i); + document.setGmtCreate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + document.setCustomField("自定义字段" + i); + Point point = new Point(13.400544 + i, 52.530286 + i); + document.setGeoLocation(point.toString()); + document.setStarNum(i); + if (i == 2) { + document.setLocation("40.17836693398477,116.64002551005981"); + document.setStarNum(1); + } else if (i == 3) { + document.setLocation("40.19103839805197,116.5624013764374"); + } else if (i == 4) { + document.setLocation("40.13933715136454,116.63441990026217"); + } + documentList.add(document); + } + int count = documentMapper.insertBatch(documentList); + Assertions.assertEquals(documentList.size(), count); + } + + // 2.修改 + @Test + @Order(3) + public void testUpdateById() { + Document document = new Document(); + document.setEsId("1"); + document.setTitle("测试文档1标题被更新了"); + int count = documentMapper.updateById(document); + Assertions.assertEquals(1, count); + } + + @Test + @Order(4) + public void testUpdateByWrapper() { + LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); + wrapper.eq(Document::getTitle, "测试文档2"); + wrapper.set(Document::getContent, "测试文档内容2的内容被更新了"); + int count = documentMapper.update(null, wrapper); + Assertions.assertEquals(1, count); + } + + @Test + @Order(4) + public void testUpdateByChainWrapper() { + int count = EsWrappers.lambdaChainUpdate(documentMapper).eq(Document::getTitle, "测试文档3") + .set(Document::getContent, "测试文档内容3的内容被修改了").update(); + Assertions.assertEquals(1, count); + } + + @Test + @Order(4) + public void testUpdateBySetSearchSourceBuilder() { + LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query( + QueryBuilders.termQuery(FieldUtils.val(Document::getTitle) + KEYWORD_SUFFIX, "测试文档2")); + wrapper.setSearchSourceBuilder(searchSourceBuilder); + Document document = new Document(); + document.setContent("测试文档内容2的内容再次被更新了"); + int count = documentMapper.update(document, wrapper); + Assertions.assertEquals(1, count); + } + + @Test + @Order(5) + public void testUpdateByWrapperAndEntity() { + LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + Document document = new Document(); + document.setCustomField("被更新的自定义字段"); + int count = documentMapper.update(document, wrapper); + Assertions.assertEquals(22, count); + } + + // 3.查询 + + @Test + @Order(6) + public void testSQL() { + // 注意 sql中的from后面跟的是要被查询的索引名,也可以是索引别名(效果一样) 由于索引名可能会变,所以此处我采用别名ee_default_alias进行查询 + String sql = "select count(*) from ee_default_alias where star_num > 0"; + String jsonResult = documentMapper.executeSQL(sql); + System.out.println(jsonResult); + Assertions.assertNotNull(jsonResult); + } + + @Test + @Order(6) + public void testDSL() { + String dsl = "{\"query\":{\"bool\":{\"must\":[{\"term\":{\"title.keyword\":{\"value\":\"测试文档3\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}},\"track_total_hits\":2147483647,\"highlight\":{\"pre_tags\":[\"\"],\"post_tags\":[\"\"],\"fragment_size\":2,\"fields\":{\"content\":{\"type\":\"unified\"}}}}"; + String jsonResult = documentMapper.executeDSL(dsl); + System.out.println(jsonResult); + Assertions.assertNotNull(jsonResult); + } + + @Test + @Order(6) + public void testSelectOne() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "内容").orderByAsc(Document::getStarNum, Document::getEsId).limit(1); + Document document = documentMapper.selectOne(wrapper); + Assertions.assertEquals("测试文档1标题被更新了", document.getTitle()); + } + + @Test + @Order(6) + public void testOne() { + // 链式调用 + Document document = EsWrappers.lambdaChainQuery(documentMapper).eq(Document::getTitle, "测试文档3").one(); + Assertions.assertEquals(document.getContent(), "测试文档内容3的内容被修改了"); + } + + @Test + @Order(6) + public void testSelectById() { + Document document = documentMapper.selectById(1); + Assertions.assertEquals("1", document.getEsId()); + Assertions.assertEquals("老汉1", document.getCreator()); + } + + @Test + @Order(6) + public void testSelectBatchIds() { + List documents = documentMapper.selectBatchIds(Arrays.asList("1", "2")); + Assertions.assertEquals(2, documents.size()); + } + + @Test + @Order(6) + public void testSelectList() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCustomField, "字段"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testIgnoreCase() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getCaseTest, "test"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(1, documents.size()); + } + + @Test + @Order(6) + public void testIp() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getIpAddress, "192.168.0.0/16"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(documents.size(), 1); + } + + @Test + @Order(6) + public void testSelectCount() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCustomField, "字段"); + Long count = documentMapper.selectCount(wrapper); + Assertions.assertEquals(22L, count); + } + + @Test + @Order(6) + public void testSelectCountDistinct() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCustomField, "字段"); + wrapper.distinct(Document::getStarNum); + Long count = documentMapper.selectCount(wrapper, true); + Assertions.assertEquals(21L, count); + } + + @Test + @Order(6) + public void testConditionAllEq() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + Map map = new HashMap<>(); + map.put("title", "测试文档3"); + map.put("creator.keyword", "老汉3"); + map.put("starNum", 3); + wrapper.allEq(map); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(1, documents.size()); + Assertions.assertEquals("测试文档3", documents.get(0).getTitle()); + } + + @Test + @Order(6) + public void testConditionEq() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getTitle, "测试文档10"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(1, documents.size()); + Assertions.assertEquals("测试文档10", documents.get(0).getTitle()); + } + + @Test + @Order(6) + public void testConditionGt() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.gt(Document::getStarNum, 20); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(2, documents.size()); + } + + @Test + @Order(6) + public void testConditionGe() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.ge(Document::getStarNum, 20); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(3, documents.size()); + } + + @Test + @Order(6) + public void testConditionLt() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.lt(Document::getStarNum, 3); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(2, documents.size()); + } + + @Test + @Order(6) + public void testConditionLe() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.le(Document::getStarNum, 3); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(3, documents.size()); + } + + @Test + @Order(6) + public void testConditionBetween() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.between(Document::getStarNum, 1, 10); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(10, documents.size()); + } + + @Test + @Order(6) + public void testConditionLike() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.like(Document::getTitle, "试文档"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testConditionLikeLeft() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.likeLeft(Document::getTitle, "文档10"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(1, documents.size()); + } + + @Test + @Order(6) + public void testConditionLikeRight() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.likeRight(Document::getTitle, "测试文"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testConditionIsNotNull() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.isNotNull(Document::getNullField); + List documents = documentMapper.selectList(wrapper); + 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() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.in(Document::getEsId, "1", "2", "3"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(3, documents.size()); + + LambdaEsQueryWrapper wrapper1 = new LambdaEsQueryWrapper<>(); + wrapper1.in(Document::getStarNum, 7, 8); + List documents1 = documentMapper.selectList(wrapper1); + Assertions.assertEquals(2, documents1.size()); + } + + @Test + @Order(6) + public void testConditionGroupBy() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "测试").groupBy(Document::getStarNum); + SearchResponse response = documentMapper.search(wrapper); + ParsedLongTerms parsedLongTerms = response.getAggregations().get("starNumTerms"); + Terms.Bucket bucket = parsedLongTerms.getBuckets().get(0); + Assertions.assertTrue(bucket.getKey().equals(1L) && bucket.getDocCount() == 2L); + } + + @Test + @Order(6) + public void testConditionMax() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "测试").max(Document::getStarNum); + SearchResponse response = documentMapper.search(wrapper); + ParsedMax parsedMax = response.getAggregations().get("starNumMax"); + Assertions.assertTrue(parsedMax.getValue() > 21); + } + + @Test + @Order(6) + public void testConditionMin() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "测试").min(Document::getStarNum); + SearchResponse response = documentMapper.search(wrapper); + ParsedMin parsedMin = response.getAggregations().get("starNumMin"); + Assertions.assertTrue(parsedMin.getValue() > 0 && parsedMin.getValue() < 2); + } + + @Test + @Order(6) + public void testConditionSum() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "测试").sum(Document::getStarNum); + SearchResponse response = documentMapper.search(wrapper); + ParsedSum parsedSum = response.getAggregations().get("starNumSum"); + Assertions.assertTrue(parsedSum.getValue() >= 252); + } + + + @Test + @Order(6) + public void testConditionAvg() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "测试").avg(Document::getStarNum); + SearchResponse response = documentMapper.search(wrapper); + ParsedAvg parsedAvg = response.getAggregations().get("starNumAvg"); + Assertions.assertTrue(parsedAvg.getValue() > 11 && parsedAvg.getValue() < 12); + } + + + @Test + @Order(6) + public void testConditionDistinct() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "测试").distinct(Document::getStarNum); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(21, documents.size()); + } + + @Test + @Order(6) + public void testConditionLimit() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉").limit(2, 5); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(5, documents.size()); + } + + @Test + @Order(6) + public void testConditionFromAndSize() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉").from(20).size(2); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(2, documents.size()); + } + + @Test + @Order(6) + public void testConditionIndex() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉") + .index(EntityInfoHelper.getEntityInfo(Document.class).getIndexName()); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testSetSearchSourceBuilder() { + // 测试混合查询的另一种方式 + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(QueryBuilders.matchQuery(FieldUtils.val(Document::getCreator), "老汉")); + Optional.ofNullable(EntityInfoHelper.getEntityInfo(Document.class)) + .flatMap(i -> Optional.ofNullable(i.getMaxResultWindow())).ifPresent(searchSourceBuilder::size); + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.setSearchSourceBuilder(searchSourceBuilder); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testConditionAnd() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.in(Document::getStarNum, 1, 2, 3, 4, 10, 11) + .and(w -> w.eq(Document::getTitle, "测试文档10").match(Document::getCreator, "老汉")); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(1, documents.size()); + } + + @Test + @Order(6) + public void testConditionOr() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.in(Document::getStarNum, 1, 10, 12, 13) + .or(i -> i.eq(Document::getTitle, "测试文档11").eq(Document::getTitle, "测试文档10")); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(5, documents.size()); + } + + @Test + @Order(6) + public void testConditionOrInner() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getTitle, "测试文档10").or().eq(Document::getTitle, "测试文档20"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(2, documents.size()); + } + + @Test + @Order(6) + public void testConditionFilter() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getStarNum, 10).filter().eq(Document::getTitle, "测试文档10"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(1, documents.size()); + } + + @Test + @Order(6) + public void testConditionNot() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.in(Document::getStarNum, 10, 11, 12, 13) + .and(i -> i.not().eq(Document::getTitle, "测试文档10").not().eq(Document::getTitle, "测试文档11")); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(2, documents.size()); + } + + + @Test + @Order(6) + public void testPageQuery() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + EsPageInfo pageInfo = documentMapper.pageQuery(wrapper, 1, 5); + Assertions.assertEquals(5, pageInfo.getSize()); + Assertions.assertEquals(22, pageInfo.getTotal()); + } + + @Test + @Order(6) + public void testChainPage() { + // 链式 + EsPageInfo pageInfo = EsWrappers.lambdaChainQuery(documentMapper).match(Document::getCreator, "老汉") + .page(1, 5); + Assertions.assertEquals(5, pageInfo.getSize()); + Assertions.assertEquals(22, pageInfo.getTotal()); + } + + + @Test + @Order(6) + public void testSearchAfter() { + LambdaEsQueryWrapper lambdaEsQueryWrapper = EsWrappers.lambdaQuery(Document.class); + lambdaEsQueryWrapper.size(10); + lambdaEsQueryWrapper.orderByDesc(Document::getEsId, Document::getStarNum); + SAPageInfo saPageInfo = documentMapper.searchAfterPage(lambdaEsQueryWrapper, null, 10); + //第一页 + System.out.println(saPageInfo); + Assertions.assertEquals(10, saPageInfo.getList().size()); + + //获取下一页 + List nextSearchAfter = saPageInfo.getNextSearchAfter(); + SAPageInfo next = documentMapper.searchAfterPage(lambdaEsQueryWrapper, nextSearchAfter, 10); + Assertions.assertEquals(10, next.getList().size()); + } + + @Test + @Order(6) + public void testFilterField() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getTitle, "测试文档10").select(Document::getEsId, Document::getContent); + Document document = documentMapper.selectOne(wrapper); + Assertions.assertNotNull(document.getContent()); + Assertions.assertNotNull(document.getEsId()); + Assertions.assertNull(document.getTitle()); + } + + @Test + @Order(6) + public void testNotFilterField() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getTitle, "测试文档10").notSelect(Document::getEsId, Document::getContent); + Document document = documentMapper.selectOne(wrapper); + Assertions.assertNull(document.getContent()); + Assertions.assertNull(document.getEsId()); + Assertions.assertNotNull(document.getTitle()); + } + + @Test + @Order(6) + public void testOrderByDesc() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + wrapper.orderByDesc(Document::getStarNum); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("22", documents.get(0).getEsId()); + Assertions.assertEquals("21", documents.get(1).getEsId()); + } + + @Test + @Order(6) + public void testOrderByAsc() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + wrapper.orderByAsc(Document::getStarNum, Document::getEsId); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("1", documents.get(0).getEsId()); + Assertions.assertEquals("22", documents.get(21).getEsId()); + } + + @Test + @Order(6) + public void testOrderBy() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + List orderByParams = new ArrayList<>(); + OrderByParam orderByParam = new OrderByParam(); + orderByParam.setOrder("star_num"); + orderByParam.setSort("DESC"); + orderByParams.add(orderByParam); + wrapper.orderBy(orderByParams); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("22", documents.get(0).getEsId()); + Assertions.assertEquals("21", documents.get(1).getEsId()); + } + + @Test + @Order(6) + public void testOrderByDistanceAsc() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + GeoPoint centerPoint = new GeoPoint(41.0, 116.0); + wrapper.match(Document::getCreator, "老汉").geoDistance(Document::getLocation, 168.8, centerPoint) + .orderByDistanceAsc(Document::getLocation, centerPoint); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("3", documents.get(0).getEsId()); + Assertions.assertEquals("4", documents.get(3).getEsId()); + } + + @Test + @Order(6) + public void testOrderByDistanceDesc() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + GeoPoint centerPoint = new GeoPoint(41.0, 116.0); + wrapper.match(Document::getCreator, "老汉").geoDistance(Document::getLocation, 168.8, centerPoint) + .orderByDistanceDesc(Document::getLocation, centerPoint); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("4", documents.get(0).getEsId()); + Assertions.assertEquals("3", documents.get(3).getEsId()); + } + + @Test + @Order(6) + public void testOrderByDistanceMulti() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + GeoPoint centerPoint = new GeoPoint(41.0, 116.0); + GeoPoint centerPoint1 = new GeoPoint(42.0, 118.0); + wrapper.match(Document::getCreator, "老汉").geoDistance(Document::getLocation, 168.8, centerPoint) + .orderByDistanceDesc(Document::getLocation, centerPoint) + .orderByDistanceDesc(Document::getLocation, centerPoint1); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("4", documents.get(0).getEsId()); + Assertions.assertEquals("3", documents.get(3).getEsId()); + } + + @Test + @Order(6) + public void testSortByScore() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉11"); + wrapper.sortByScore(); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("11", documents.get(0).getEsId()); + } + + @Test + @Order(6) + public void testSort() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + FieldSortBuilder fieldSortBuilder = SortBuilders.fieldSort( + FieldUtils.getRealField(FieldUtils.val(Document::getStarNum), + EntityInfoHelper.getEntityInfo(Document.class).getMappingColumnMap())); + fieldSortBuilder.order(SortOrder.DESC); + wrapper.sort(fieldSortBuilder); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals("22", documents.get(0).getEsId()); + Assertions.assertEquals("21", documents.get(1).getEsId()); + } + + @Test + @Order(6) + public void testMatch() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testMatchPhrase() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.matchPhrase(Document::getContent, "测试"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertTrue(documents.size() > 0); + + LambdaEsQueryWrapper wrapper1 = new LambdaEsQueryWrapper<>(); + wrapper1.matchPhrase(Document::getContent, "内容测试"); + List documents1 = documentMapper.selectList(wrapper1); + Assertions.assertTrue(documents1.size() <= 0); + } + + @Test + @Order(6) + public void testMatchAllQuery() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.matchAllQuery(); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testMatchPhrasePrefixQuery() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.matchPhrasePrefixQuery(Document::getContent, "测试"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testMultiMatchQuery() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.multiMatchQuery("老汉", Document::getContent, Document::getCreator, Document::getCustomField); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + + LambdaEsQueryWrapper wrapper1 = new LambdaEsQueryWrapper<>(); + wrapper1.multiMatchQuery("更新", Document::getContent, Document::getCreator); + List documents1 = documentMapper.selectList(wrapper1); + Assertions.assertEquals(1, documents1.size()); + } + + @Test + @Order(6) + public void testQueryStringQuery() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.queryStringQuery("老汉"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testPrefixQuery() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.prefixQuery(Document::getContent, "测试"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testHighLight() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getContent, "测试"); + List documents = documentMapper.selectList(wrapper); + Assertions.assertTrue(documents.get(0).getHighlightContent().contains("测试")); + } + + @Test + @Order(6) + public void testGeoBoundingBox() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + GeoPoint leftTop = new GeoPoint(41.187328D, 115.498353D); + GeoPoint bottomRight = new GeoPoint(39.084509D, 117.610461D); + wrapper.geoBoundingBox(Document::getLocation, leftTop, bottomRight); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(4, documents.size()); + } + + + @Test + @Order(6) + public void testGeoDistance() { + 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); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(4, documents.size()); + } + + @Test + @Order(6) + public void testGeoPolygon() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + List geoPoints = new ArrayList<>(); + GeoPoint geoPoint = new GeoPoint(40.178012, 116.577188); + GeoPoint geoPoint1 = new GeoPoint(40.169329, 116.586315); + GeoPoint geoPoint2 = new GeoPoint(40.178288, 116.591813); + geoPoints.add(geoPoint); + geoPoints.add(geoPoint1); + geoPoints.add(geoPoint2); + wrapper.geoPolygon(Document::getLocation, geoPoints); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(1, documents.size()); + } + + @Test + @Order(6) + public void testGeoShape() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + Circle circle = new Circle(13, 14, 100); + wrapper.geoShape(Document::getGeoLocation, circle, ShapeRelation.DISJOINT); + List documents = documentMapper.selectList(wrapper); + Assertions.assertEquals(22, documents.size()); + } + + @Test + @Order(6) + public void testDefaultMethod() { + List documents = documentMapper.testDefaultMethod(); + Assertions.assertEquals(1, documents.size()); + } + + @Test + @Order(6) + public void testMultiFieldSelect() { + // 药品 中文名叫葡萄糖酸钙口服溶液 英文名叫 Calcium Gluconate 汉语拼音为 putaotangsuangaikoufurongye + // 用户可以通过模糊检索,例如输入 Calcium 或 葡萄糖 或 putaotang时对应药品均可以被检索到 + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match("english", "Calcium").or().match("multi_field.zh", "葡萄糖").or() + .match("multi_field.pinyin", "putaotang"); + List documents = documentMapper.selectList(wrapper); + System.out.println(documents); + } + + // 4.删除 + @Test + @Order(7) + public void testDeleteById() { + int count = documentMapper.deleteById("1"); + Assertions.assertEquals(1, count); + } + + @Test + @Order(8) + public void testDeleteBatchIds() { + List idList = Arrays.asList("2", "3", "4"); + int count = documentMapper.deleteBatchIds(idList); + Assertions.assertEquals(3, count); + } + + @Test + @Order(9) + public void testDeleteByWrapper() { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.match(Document::getCreator, "老汉"); + int count = documentMapper.delete(wrapper); + Assertions.assertEquals(18, count); + } + + @Test + @Order(10) + public void testDeleteIndex() { + boolean deleted = documentMapper.deleteIndex(EntityInfoHelper.getEntityInfo(Document.class).getIndexName()); + boolean lockDeleted = documentMapper.deleteIndex(BaseEsConstants.LOCK_INDEX); + Assertions.assertTrue(deleted); + Assertions.assertTrue(lockDeleted); + } + + @Test + @Order(9) + public void testComplex() { + // SQL写法 + // where business_type = 1 and (state = 9 or (state = 8 and bidding_sign = 1)) or (business_type = 2 and state in (2,3)) + + // RestHighLevelClient写法 + 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); + System.out.println("--------------------"); + + // MP及EE写法 + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq("business_type", 1).and(a -> a.eq("state", 9).or(b -> b.eq("state", 8).eq("bidding_sign", 1))) + .or(i -> i.eq("business_type", 2).in("state", 2, 3)); + documentMapper.selectList(wrapper); + } + } diff --git a/easy-es-test/src/test/resources/application.yml b/easy-es-test/src/test/resources/application.yml index 30a033f..a0174ff 100644 --- a/easy-es-test/src/test/resources/application.yml +++ b/easy-es-test/src/test/resources/application.yml @@ -1,6 +1,6 @@ easy-es: # enable: true - address: 10.20.64.228:9200 + address: 192.168.9.58:9200 schema: http # username: elastic # password: WG7WVmuNMtM4GwNYkyWH