搜索引擎ORM框架Easy-Es(搜索引擎 框架)
項(xiàng)目簡(jiǎn)介
Easy-Es(簡(jiǎn)稱EE) 是一款基于ElasticSearch(簡(jiǎn)稱Es)官方提供的RestHighLevelClient打造的ORM開(kāi)發(fā)框架,在RestHighLevelClient的基礎(chǔ)上,只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,您如果有用過(guò)MyBatis-Plus(簡(jiǎn)稱MP),那么您基本可以零學(xué)習(xí)成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更簡(jiǎn)單,同時(shí)也融入了更多Es獨(dú)有的功能,助力您快速實(shí)現(xiàn)各種場(chǎng)景的開(kāi)發(fā)。
項(xiàng)目地址
- Easy-Es Gitee:gitee.com/dromara/eas…
- Elasticsearch Download:www.elastic.co/cn/download…
Easy-Es自身優(yōu)勢(shì)
- 全自動(dòng)索引托管: 全球開(kāi)源首創(chuàng)的索引托管模式,開(kāi)發(fā)者無(wú)需關(guān)心索引的創(chuàng)建更新及數(shù)據(jù)遷移等繁瑣步驟,索引全生命周期皆可托管給框架,由框架自動(dòng)完成,過(guò)程零停機(jī),用戶無(wú)感知,徹底解放開(kāi)發(fā)者;
- 屏蔽語(yǔ)言差異: 開(kāi)發(fā)者只需要會(huì)MySQL語(yǔ)法即可使用Es,真正做到一通百通,無(wú)需學(xué)習(xí)枯燥易忘的Es語(yǔ)法,Es使用相對(duì)MySQL較低頻,學(xué)了長(zhǎng)期不用也會(huì)忘,沒(méi)必要浪費(fèi)這時(shí)間.開(kāi)發(fā)就應(yīng)該專注于業(yè)務(wù),省下的時(shí)間去擼鐵,去陪女朋友陪家人,不做資本家的韭菜;
- 代碼量極少: 與直接使用RestHighLevelClient相比,相同的查詢平均可以節(jié)省3-5倍左右的代碼量
- 零魔法值: 字段名稱直接從實(shí)體中獲取,無(wú)需輸入字段名稱字符串這種魔法值,提高代碼可讀性,杜絕因字段名稱修改而代碼漏改帶來(lái)的Bug;
- 零額外學(xué)習(xí)成本: 開(kāi)發(fā)者只要會(huì)國(guó)內(nèi)最受歡迎的Mybatis-Plus語(yǔ)法,即可無(wú)縫遷移至EE,EE采用和前者相同的語(yǔ)法,消除使用者額外學(xué)習(xí)成本,直接上手;
- 降低開(kāi)發(fā)者門檻: Es通常需要中高級(jí)開(kāi)發(fā)者才能駕馭,但通過(guò)接入EE,即便是只了解ES基礎(chǔ)的初學(xué)者也可以輕松駕馭ES完成絕大多數(shù)需求的開(kāi)發(fā),可以提高人員利用率,降低企業(yè)成本。
特性
- 無(wú)侵入:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑;
- 損耗小:?jiǎn)?dòng)即會(huì)自動(dòng)注入基本CURD,性能基本無(wú)損耗,直接面向?qū)ο蟛僮鳎?/li>
- 強(qiáng)大的 CRUD 操作:內(nèi)置通用Mapper,僅僅通過(guò)少量配置即可實(shí)現(xiàn)大部分CRUD操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需;
- 支持 Lambda 形式調(diào)用:通過(guò)Lambda表達(dá)式,方便的編寫各類查詢條件,無(wú)需再擔(dān)心字段寫錯(cuò)段;
- 支持主鍵自動(dòng)生成:支持 2 種主鍵策略,可自由配置,完美解決主鍵問(wèn)題;
- 支持 ActiveRecord 模式:支持ActiveRecord形式調(diào)用,實(shí)體類只需繼承Model類即可進(jìn)行強(qiáng)大的 CRUD操作;
- 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere );
- 內(nèi)置分頁(yè)插件:基于RestHighLevelClient物理分頁(yè),開(kāi)發(fā)者無(wú)需關(guān)心具體操作,且無(wú)需額外配置插件,寫分頁(yè)等同于普通List查詢,且保持和PageHelper插件同樣的分頁(yè)返回字段,無(wú)需擔(dān)心命名影響;
- MySQL功能全覆蓋:MySQL中支持的功能通過(guò)EE都可以輕松實(shí)現(xiàn);
- 支持ES高階語(yǔ)法:支持高亮搜索,分詞查詢,權(quán)重查詢, Geo地理位置查詢、IP查詢、聚合查詢等高階語(yǔ)法;
- 良好的拓展性:底層仍使用RestHighLevelClient,可保持其拓展性,開(kāi)發(fā)者在使用EE的同時(shí),仍可使用RestHighLevelClient的功能。
?最新版本 Latest Version: v.1.1.1
Maven:
xml復(fù)制代碼<dependency> <groupId>cn.easy-es</groupId> <artifactId>easy-es-boot-starter</artifactId> <version>${Latest Version}</version></dependency>
Gradle:
csharp復(fù)制代碼compile group: 'cn.easy-es', name: 'easy-es-boot-starter', version: 'Latest Version'
Easy-Es適用場(chǎng)景
1?? 檢索類服務(wù)
- 搜索文庫(kù)
- 電商商品搜索
- 海量系統(tǒng)日志搜索
2?? 問(wèn)答類服務(wù)
- 在線智能客服
- 機(jī)器人
3?? 地圖類服務(wù)
- 打車APP
- 外賣APP
- 社區(qū)團(tuán)購(gòu)配送
- 社交APP
注解
EsMapperScan
- 描述:mapper掃描注解,功能與Mybatis Plus的@MapperScan一致
- 使用位置:Spring Boot啟動(dòng)類
kotlin復(fù)制代碼@EsMapperScan("cn.easy-es-mapper")public class Application{ // 省略其它...}
@IndexName
- 描述:索引名注解,標(biāo)識(shí)實(shí)體類對(duì)應(yīng)的索引 對(duì)應(yīng)Mybatis Plus的@TableName注解,在v0.9.40之前此注解為@TableName;
- 使用位置:實(shí)體類
kotlin復(fù)制代碼@IndexNamepublic class Document { // 省略其它字段}
屬性 | 類型 | 是否必須指定 | 默認(rèn)值 | 描述 |
value | String | 否 | "" | 索引名,可以簡(jiǎn)單理解為MySQL表名 |
shardsNum | int | 否 | 1 | 索引分片數(shù) |
replicasNum | int | 否 | 1 | 索引副本數(shù) |
aliasName | String | 否 | "" | 索引別名 |
keepGlobalPrefix | Boolean | 否 | false | 是否保持使用全局的tablePrefix,與MP的用法一致 |
child | boolean | 否 | false | 是否子文檔 |
childClass | Class | 否 | DefaultChildClass.class | 父子分檔-子文檔類 |
maxResultWindow | int | 否 | 10000 | 分頁(yè)返回的最大數(shù)據(jù)量,默認(rèn)值為1萬(wàn)條,超出推薦使用searchAfter或滾動(dòng)查詢等方式 |
@IndexId
- 描述:Easy-Es主鍵注解,在v0.9.40之前此注解為@TableId;
- 使用位置:實(shí)體類中被作為Easy-Es主鍵的字段, 對(duì)應(yīng)MyBatis-Plus的@TableId注解。
kotlin復(fù)制代碼public class Document { @IndexId private String id; // 省略其它字段}
屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
value | String | 否 | "_id" | 主鍵字段名 |
type | Enum | 否 | IdType.NONE | 指定主鍵類型 |
@IndexField
- 描述:ES字段注解, 對(duì)應(yīng)MP的@TableField注解,在v0.9.40之前此注解為@TableField;
- 使用位置:實(shí)體類中被作為ES索引字段的字段;
- 使用場(chǎng)景舉例:
- 實(shí)體類中的字段并非ES中實(shí)際的字段,比如把實(shí)體類直接當(dāng)DTO用了,加了一些ES中并不存在的無(wú)關(guān)字段,此時(shí)可以標(biāo)記此字段,以便讓EE框架跳過(guò)此字段,對(duì)此字段不處理;
- 字段的更新策略,比如在調(diào)用更新接口時(shí),實(shí)體類的字段非Null或者非空字符串時(shí)才更新,此時(shí)可以加字段注解,對(duì)指定字段標(biāo)記更新策略;
- 需要對(duì)類型為text或keyword_text字段聚合時(shí),可指定其fieldData=true,否則es會(huì)報(bào)錯(cuò);
- 對(duì)指定字段進(jìn)行自定義命名,比如該字段在es中叫wu-la,但在實(shí)體model中叫ula,此時(shí)可以在value中指定value="wu-la";
- 在自動(dòng)托管索引模式下,可指定索引分詞器及索引字段類型;
- 在自動(dòng)托管索引模式下,可指定索引中日期的format格式。
使用示例:
typescript復(fù)制代碼public class Document { // 此處省略其它字段... // 場(chǎng)景一:標(biāo)記es中不存在的字段 @IndexField(exist = false) private String notExistsField; // 場(chǎng)景二:更新時(shí),此字段非空字符串才會(huì)被更新 @IndexField(strategy = FieldStrategy.NOT_EMPTY) private String creator; // 場(chǎng)景三: 指定fieldData @IndexField(fieldType = FieldType.text, fieldData = true) private String filedData; // 場(chǎng)景四:自定義字段名 @IndexField("wu-la") private String ula; // 場(chǎng)景五:支持日期字段在es索引中的format類型 @IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis") private String gmtCreate; // 場(chǎng)景六:支持指定字段在es索引中的分詞器類型 @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD) private String content;}
屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
value | String | 否 | "" | 字段名 |
exist | boolean | 否 | true | 字段是否存在 |
fieldType | Enum | 否 | FieldType.NONE | 字段在es索引中的類型 |
fieldData | boolean | 否 | false | text類型字段是否支持聚合 |
analyzer | String | 否 | Analyzer.NONE | 索引文檔時(shí)用的分詞器 |
searchAnalyzer | String | 否 | Analyzer.NONE | 查詢分詞器 |
strategy | Enum | 否 | FieldStrategy.DEFAULT | 字段驗(yàn)證策略 |
dateFormat | String | 否 | "" | es索引中的日期格式,如yyyy-MM-dd |
nestedClass | Class | 否 | DefaultNestedClass.class | 嵌套類 |
parentName | String | 否 | "" | 父子文檔-父名稱 |
childName | String | 否 | "" | 父子文檔-子名稱 |
joinFieldClass | Class | 否 | JoinField.class | 父子文檔-父子類型關(guān)系字段類 |
@Score
- 描述:得分注解
- 使用位置:實(shí)體類中被作為ES查詢得分返回的字段
- 使用場(chǎng)景舉例:比如需要知道本次匹配查詢得分有多少時(shí),可以在實(shí)體類中添加一個(gè)類型為Float/float的字段,并在該字段上添加@Score注解,在后續(xù)查詢中,若es有返回當(dāng)次查詢的得分,則此得分會(huì)自動(dòng)映射至此字段上
屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
decimalPlaces | int | 否 | 0 | 得分保留小數(shù)位,默認(rèn)不處理,保持es返回的得分值 |
@Distance
- 描述:距離注解
- 使用位置:實(shí)體類中被作為ES地理位置排序距離值的返回字段
- 使用場(chǎng)景舉例:比如需要知道按距離由近及遠(yuǎn)查詢后的數(shù)據(jù),實(shí)際距離某一坐標(biāo)有多遠(yuǎn),可以在實(shí)體類中添加一個(gè)類型為Double/double的字段,并在該字段上添加@Distance注解,在后續(xù)查詢中,若es有返回距離,則此距離會(huì)自動(dòng)映射至此字段上
屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
decimalPlaces | int | 否 | 0 | 距離保留小數(shù)位,默認(rèn)不處理,保持es返回的距離值 |
sortBuilderIndex | int | 否 | 0 | 排序字段在sortBuilders中的位置, 默認(rèn)為0,若有多個(gè)排序器,則指定為其所在位置 |
ES版本和Spring Boot版本
xml復(fù)制代碼<properties> <java.version>1.8</java.version> <easy-es.version>1.1.1</easy-es.version> <elasticsearch.version>7.14.0</elasticsearch.version></properties><!-- easy-es --><dependency> <groupId>cn.easy-es</groupId> <artifactId>easy-es-boot-starter</artifactId> <version>${easy-es.version}</version> <exclusions> <exclusion> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </exclusion> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> </exclusions></dependency><!-- elasticsearch --><dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version></dependency><dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch.version}</version></dependency>
Spring Boot配置
在 application.yml 配置文件中添加EasyEs必須的相關(guān)配置:
yaml復(fù)制代碼easy-es: enable: true #默認(rèn)為true,若為false則認(rèn)為不啟用本框架 address : 127.0.0.1:9200 # es的連接地址,必須含端口 若為集群,則可以用逗號(hào)隔開(kāi) 例如:127.0.0.1:9200,127.0.0.2:9200 username: elastic #若無(wú) 則可省略此行配置 password: WG7WVmuNMtM4GwNYkyWH #若無(wú) 則可省略此行配置
BaseEsMapper CRUD接口
Easy-Es封裝了基本的CRUD操作API,通過(guò)繼承BaseEsMapper<T>賦予相關(guān)能力,比如:
csharp復(fù)制代碼public interface DocumentMapper extends BaseEsMapper<Document> {}
相關(guān)操作API
php復(fù)制代碼public interface BaseEsMapper<T> { /** * 是否存在索引 * * @param indexName 索引名稱 * @return 返回是否存在的布爾值 */ Boolean existsIndex(String indexName); /** * 獲取當(dāng)前索引信息 * * @return 當(dāng)前索引信息 */ GetIndexResponse getIndex(); /** * 獲取指定索引信息 * * @param indexName 指定索引名 * @return 指定索引信息 */ GetIndexResponse getIndex(String indexName); /** * 創(chuàng)建索引,根據(jù)當(dāng)前mapper對(duì)應(yīng)實(shí)體類信息及其注解配置生成索引信息 * * @return 是否創(chuàng)建成功 */ Boolean createIndex(); /** * 創(chuàng)建索引,根據(jù)當(dāng)前mapper對(duì)應(yīng)實(shí)體類信息及其注解配置生成索引信息 可指定索引名進(jìn)行創(chuàng)建 適用于定時(shí)任務(wù)按日期創(chuàng)建索引場(chǎng)景 * * @param indexName 指定的索引名,會(huì)覆蓋注解上指定的索引名 * @return 是否創(chuàng)建成功 */ Boolean createIndex(String indexName); /** * 創(chuàng)建索引 * * @param wrapper 條件 * @return 是否成功 */ Boolean createIndex(LambdaEsIndexWrapper<T> wrapper); /** * 更新索引 * * @param wrapper 條件 * @return 是否成功 */ Boolean updateIndex(LambdaEsIndexWrapper<T> wrapper); /** * 刪除指定索引 * * @param indexNames 索引名稱數(shù)組 * @return 是否成功 */ Boolean deleteIndex(String... indexNames); /** * 標(biāo)準(zhǔn)查詢 * * @param wrapper 條件 * @return es標(biāo)準(zhǔn)結(jié)果 */ SearchResponse search(LambdaEsQueryWrapper<T> wrapper); /** * 獲取SearchSourceBuilder,可用于本框架生成基礎(chǔ)查詢條件,不支持的高階語(yǔ)法用戶可通過(guò)SearchSourceBuilder 進(jìn)一步封裝 * * @param wrapper 條件 * @return 查詢參數(shù) */ SearchSourceBuilder getSearchSourceBuilder(LambdaEsQueryWrapper<T> wrapper); /** * es原生查詢 * * @param searchrequest 查詢請(qǐng)求參數(shù) * @param requestOptions 類型 * @return es原生返回結(jié)果 * @throws IOException IO異常 */ SearchResponse search(SearchRequest searchRequest, RequestOptions requestOptions) throws IOException; /** * es原生滾動(dòng)查詢 * * @param searchScrollRequest 查詢請(qǐng)求參數(shù) * @param requestOptions 類型 * @return es原生返回結(jié)果 * @throws IOException IO異常 */ SearchResponse scroll(SearchScrollRequest searchScrollRequest, RequestOptions requestOptions) throws IOException; /** * 獲取通過(guò)本框架生成的查詢參數(shù),可用于檢驗(yàn)本框架生成的查詢參數(shù)是否正確 * * @param wrapper 條件 * @return 查詢JSON格式參數(shù) */ String getSource(LambdaEsQueryWrapper<T> wrapper); /** * 指定返回類型及分頁(yè)參數(shù) * * @param wrapper 條件 * @param pageNum 當(dāng)前頁(yè) * @param pageSize 每頁(yè)條數(shù) * @return 指定的返回類型 */ EsPageInfo<T> pageQuery(LambdaEsQueryWrapper<T> wrapper, Integer pageNum, Integer pageSize); /** * searchAfter類型分頁(yè) * * @param wrapper 條件 * @param searchAfter 當(dāng)前頁(yè) 第一頁(yè)時(shí)為null * @param pageSize 每頁(yè)條數(shù) * @return 指定的返回類型 */ SAPageInfo<T> searchAfterPage(LambdaEsQueryWrapper<T> wrapper, List<Object> searchAfter, Integer pageSize); /** * 獲取總數(shù)(智能推斷:若wrapper中指定了去重字段則去重,若未指定則不去重 推薦使用) * * @param wrapper 條件 * @return 總數(shù) */ Long selectCount(LambdaEsQueryWrapper<T> wrapper); /** * 無(wú)論wrapper中是否指定去重字段,都以用戶傳入的distinct布爾值作為是否去重的條件 * * @param wrapper 條件 * @param distinct 是否去重 * @return 總數(shù) */ Long selectCount(LambdaEsQueryWrapper<T> wrapper, boolean distinct); /** * 插入一條記錄 * * @param entity 插入的數(shù)據(jù)對(duì)象 * @return 成功條數(shù) */ Integer insert(T entity); /** * 插入一條記錄,可指定多索引插入 * * @param entity 插入的數(shù)據(jù)對(duì)象 * @param indexNames 指定插入的索引名數(shù)組 * @return 總成功條數(shù) */ Integer insert(T entity, String... indexNames); /** * 批量插入 * * @param entityList 插入的數(shù)據(jù)對(duì)象列表 * @return 總成功條數(shù) */ Integer insertBatch(Collection<T> entityList); /** * 批量插入 * * @param entityList 插入的數(shù)據(jù)對(duì)象列表 * @param indexNames 指定插入的索引名數(shù)組 * @return 總成功條數(shù) */ Integer insertBatch(Collection<T> entityList, String... indexNames); /** * 根據(jù) ID 刪除 * * @param id 主鍵 * @return 成功條數(shù) */ Integer deleteById(Serializable id); /** * 根據(jù) ID 刪除 * * @param id 主鍵 * @param indexNames 指定刪除的索引名數(shù)組 * @return 總成功條數(shù) */ Integer deleteById(Serializable id, String... indexNames); /** * 刪除(根據(jù)ID 批量刪除) * * @param idList 主鍵列表 * @return 總成功條數(shù) */ Integer deleteBatchIds(Collection<? extends Serializable> idList); /** * 刪除(根據(jù)ID 批量刪除) * * @param idList 主鍵列表 * @param indexNames 指定刪除的索引名數(shù)組 * @return 總成功條數(shù) */ Integer deleteBatchIds(Collection<? extends Serializable> idList, String... indexNames); /** * 根據(jù) entity 條件,刪除記錄 * * @param wrapper 條件 * @return 總成功條數(shù) */ Integer delete(LambdaEsQueryWrapper<T> wrapper); /** * 根據(jù) ID 更新 * * @param entity 更新對(duì)象 * @return 總成功條數(shù) */ Integer updateById(T entity); /** * 根據(jù) ID 更新 * * @param entity 更新對(duì)象 * @param indexNames 指定更新的索引名稱數(shù)組 * @return 總成功條數(shù) */ Integer updateById(T entity, String... indexNames); /** * 根據(jù)ID 批量更新 * * @param entityList 更新對(duì)象列表 * @return 總成功條數(shù) */ Integer updateBatchByIds(Collection<T> entityList); /** * 根據(jù)ID 批量更新 * * @param entityList 更新對(duì)象列表 * @param indexNames 指定更新的索引名稱數(shù)組 * @return 總成功條數(shù) */ Integer updateBatchByIds(Collection<T> entityList, String... indexNames); /** * 根據(jù) whereEntity 條件,更新記錄 * * @param entity 更新對(duì)象 * @param updateWrapper 條件 * @return 成功條數(shù) */ Integer update(T entity, LambdaEsUpdateWrapper<T> updateWrapper); /** * 根據(jù) ID 查詢 * * @param id 主鍵 * @return 指定的返回對(duì)象 */ T selectById(Serializable id); /** * 根據(jù) ID 查詢 * * @param id 主鍵 * @param indexNames 指定查詢的索引名數(shù)組 * @return 指定的返回對(duì)象 */ T selectById(Serializable id, String... indexNames); /** * 查詢(根據(jù)ID 批量查詢) * * @param idList 主鍵列表 * @return 指定的返回對(duì)象列表 */ List<T> selectBatchIds(Collection<? extends Serializable> idList); /** * 查詢(根據(jù)ID 批量查詢) * * @param idList 主鍵列表 * @param indexNames 指定查詢的索引名數(shù)組 * @return 指定的返回對(duì)象列表 */ List<T> selectBatchIds(Collection<? extends Serializable> idList, String... indexNames); /** * 根據(jù) entity 條件,查詢一條記錄 * * @param wrapper 條件 * @return 指定的返回對(duì)象 */ T selectOne(LambdaEsQueryWrapper<T> wrapper); /** * 根據(jù) entity 條件,查詢?nèi)坑涗? * * @param wrapper 條件 * @return 指定的返回對(duì)象列表 */ List<T> selectList(LambdaEsQueryWrapper<T> wrapper); /** * 設(shè)置當(dāng)前Mapper默認(rèn)激活的全局索引名稱 務(wù)必謹(jǐn)慎操作,設(shè)置后全局生效,永駐jvm,除非項(xiàng)目重啟 * * @param indexName 索引名稱 * @return 是否成功 */ Boolean setCurrentActiveIndex(String indexName);}
Tips提示:
CRUD接口用法基本與MyBatis-Plus一致;
用戶需要繼承的Mapper為BaseEsMapper,而非BaseMapper;
EE沒(méi)有提供Service層,而是把MyBatis-Plus中一些Service層的方法直接下沉到Mapper層了,用戶用起來(lái)會(huì)更方便。
Easy-ES整合實(shí)踐
- 第一步:確保你的環(huán)境已經(jīng)安裝ElasticSearch,博主這里的演示版本為7.14.0,運(yùn)行ElasticSearch;
- 第二步:創(chuàng)建Maven Project,引入Easy-Es依賴;
- 第三步:定義文檔類Document,測(cè)試Easy-Es的CRUD基本操作。
1?? 運(yùn)行ElasticSearch
訪問(wèn):http://localhost:9200/,查看節(jié)點(diǎn)信息。
bash復(fù)制代碼{ "name": "LAPTOP-8G2EVQFP", # 默認(rèn)節(jié)點(diǎn)名稱 "cluster_name": "elasticsearch", "cluster_uuid": "nnFJExSMRj-gy09OeHRk5A", "version": { # ES版本 "number": "7.3.2", "build_flavor": "default", "build_type": "zip", "build_hash": "1c1faf1", "build_date": "2019-09-06T14:40:30.409026Z", "build_snapshot": false, "lucene_version": "8.1.0", "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.0.0-beta1" }, "tagline": "You Know, for Search"}
2?? 創(chuàng)建Spring Boot項(xiàng)目,添加依賴
添加POM依賴:
xml復(fù)制代碼<properties> <java.version>1.8</java.version> <easy-es.version>1.1.1</easy-es.version> <elasticsearch.version>7.14.0</elasticsearch.version> <spring-boot-data-elasticsearch.version>3.0.4</spring-boot-data-elasticsearch.version></properties><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- easy-es --> <dependency> <groupId>cn.easy-es</groupId> <artifactId>easy-es-boot-starter</artifactId> <version>${easy-es.version}</version> <exclusions> <exclusion> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </exclusion> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> </exclusions> </dependency> <!-- elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch.version}</version> </dependency></dependencies>
文檔類Document
arduino復(fù)制代碼@Datapublic class Document { /** * es中的唯一id */ private String id; /** * 文檔標(biāo)題 */ private String title; /** * 文檔內(nèi)容 */ private String content;}
DocumentMapper
csharp復(fù)制代碼public interface DocumentMapper extends BaseEsMapper<Document> {}
EsDocumentController
typescript復(fù)制代碼@RestController@RequiredArgsConstructor(onConstructor = @__(@Autowired))public class EsDocumentController { private final DocumentMapper documentMapper; @GetMapping("/insert") public Integer insert() { // 初始化-> 新增數(shù)據(jù) Document document = new Document(); document.setId("1"); document.setTitle("austin"); document.setContent("austin-framework-elasticsearch"); return documentMapper.insert(document); } @RequestMapping("/update") public Integer update() { // 更新 Document document = new Document(); document.setId("1"); document.setContent("updated content!"); return documentMapper.updateById(document); } @GetMapping("/search") public List<Document> search() { // 查詢出所有標(biāo)題為austin的文檔列表 LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>(); wrapper.eq(Document::getTitle, "austin"); return documentMapper.selectList(wrapper); } @DeleteMapping("/delete") public Integer delete() { // 根據(jù)ID刪除 LambdaEsQueryWrapper<Document> esQueryWrapper = new LambdaEsQueryWrapper<>(); esQueryWrapper.eq(Document::getId, "1"); return documentMapper.delete(esQueryWrapper); }}
applcation.properties
ini復(fù)制代碼server.port=26686spring.application.name=framework-elasticsearchspring.datasource.url=jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghaispring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivereasy-es.address=127.0.0.1:9200easy-es.enable=trueeasy-es.username=elasticeasy-es.password=
3?? 執(zhí)行CRUD操作
訪問(wèn):http://localhost:26686/insert 插入條數(shù)據(jù),接著訪問(wèn):http://localhost:26686/search 根據(jù)title 字段查詢文檔信息。
總結(jié)
實(shí)際上,Easy-Es還有很多拓展功能,比如:混合查詢、原生查詢、分頁(yè)查詢、嵌套查詢、Join父子類型、獲取DSL語(yǔ)句,同時(shí)也包含很多高階語(yǔ)法:查詢字段過(guò)濾、排序、聚合查詢、分詞查詢、權(quán)重、高亮查詢、GEO地理位置查詢等等功能。
鏈接:https://juejin.cn/post/7207410405785337916