# smartes **Repository Path**: iozxc/smartes ## Basic Information - **Project Name**: smartes - **Description**: mybatis-plus整合elasticsearch。且能够自动的增删改(还可定制)elasticsearch的index数据,以及自动创建index。还有简化版的es的搜索功能,达到基本的单keyword查询功能 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2021-08-15 - **Last Updated**: 2024-04-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## mybatis-plus整合elasticsearch7.14。且能够自动的增删改(还可定制)elasticsearch的index数据,以及自动创建index。还有简化版的es的搜索功能,达到基本的单keyword查询功能 ### maven ```xml cn.omisheep smartes-spring-boot-starter 0.0.5 ``` ```yml smartes: client: hostname: # 服务器ip port: 9200 scheme: http username: # 用户名 password: # 密码 service: pre-tags: post-tags: pkg: # 实体类所在包名 ``` - 版本使用7.14.0 ### 1. 自动创建索引 如下,有三个注解,分别是`@Index`,`@IndexId`,`@IndexField`。 ```java @Data @Index @TableName("article") @Accessors(chain = true) public class Article { @TableId(value = "id", type = IdType.AUTO) @IndexId private Integer id; @IndexField(isSearch = false) private String userAvatar; @IndexField private String type; @IndexField private String tags; @IndexField private String title; @IndexField(searchAnalyzer = "ik_smart") private String content; @IndexField(isSearch = false) private String firstPicture; @IndexField private String description; @IndexField private Integer views; // 浏览量 @IndexField @TableField(value = "`like`") private Integer like; // 浏览量 @IndexField private Date createTime; } ``` - `@Index` 该注解用于实体类上面,被注解标记的实体类在springboot运行时会自动判断你的服务器有没有对应的索引,如果没有会创建,有的话会update - `@IndexId` 该注解用于属性上,被该注解标记的实体类在创建index时或者数据自动增删改时会将其当作es的id,什么类型无所谓,类型会自动转成string。 - `@IndxField` 该注解用于属性上,被该注解标记的实体类顾名思义就是index里面的属性。可以自定义**搜索方式**,**分词方式**,**指定类型**,** 指定名称** ,基础类型可以不写,其他的,比如String类型可以有text或者keyword。默认text。 ### 2. 增删改统一方法 如下 ```java public interface ElasticSearchService { boolean isIndex(Class clz); boolean createIndex(Class clz); boolean isExistIndex(Class clz); boolean isAllExistIndex(); boolean updateIndex(Class clz); int insert(E o); boolean insert(List list); int update(E o); boolean update(List list); int delete(String clzName, String id); boolean delete(String clzName, List list); HashMap> search(String keyword, Integer pageNo, Integer pageSize, String type, String index, String must, String should, Boolean isHighlight, Map matchQuery); HashMap> list(Integer pageNo, Integer pageSize, String index, String sortName, String order, Map matchQuery); } ``` ### 3. 搜索查询 ```java import java.util.HashMap; @RestController @RequestMapping @Slf4j public class SearchController { @Autowired private ElasticSearchService elasticSearchService; @GetMapping(value = {"/search", "/s"}) public Result search(@RequestParam(value = "kw", required = false) String keyword, @RequestParam(required = false) Integer pageNo, @RequestParam(required = false) Integer pageSize, @RequestParam(required = false) String type, @RequestParam(required = false) String index, @RequestParam(required = false) String must, @RequestParam(required = false) String should, @RequestParam(value = "highlight", required = false, defaultValue = "true") Boolean isHighlight) { if (keyword == null) { return Result.SUCCESS.data(); } HashMap map = new HashMap<>(); map.put("published", true); HashMap> search = elasticSearchService.search(keyword, pageNo, pageSize, type, index, must, should, isHighlight, map); return Result.SUCCESS.data(search); } @GetMapping(value = {"/list", "/l"}) public Result list(@RequestParam(value = "i", required = false) String index, @RequestParam(required = false) Integer pageNo, @RequestParam(required = false) Integer pageSize, @RequestParam(required = false) String sortName, @RequestParam(required = false) String order) { if (index == null) { return Result.SUCCESS.data(); } HashMap> list = elasticSearchService.list(pageNo, pageSize, index, sortName, order, null); return Result.SUCCESS.data(list); } } ``` - **search**方法。根据关键字,在指定的index里面搜索,支持分页,可以指定搜索的字段,以及是must还是should。同时是否要高亮显示。 ```java public HashMap> search(String keyword, Integer pageNo, Integer pageSize, String type, String index, String must, String should, Boolean isHighlight){...} ``` > `index` 这个字段可以写成如 **user,blog,comment** 这种格式用逗号隔开。must,should同理。 > > `type` 为只有在must和should都为null时才生效,默认把指定index的指定类型的所有内容全部查询出来。 - **list** 方法。得到一个排序的集合,支持分页。 ```java public HashMap> list(Integer pageNo, Integer pageSize, String index, String sortName, String order) ``` > `index` 指定的indx名,用法和search一样,可以多个。 > > `sortName` 排序的字段名,可以为空,使用默认排序 > > `order` 排序方式 ASC 或者 DESC 以上两个方法的返回值格式如图 ```json { "article": [ { "createTime": "xx-xx-xx xx:xx:xx", "like": 123123, "userAvatar": "", "description": "nihaoa ", "id": "21", "content": "zxc", "views": 999, "tags": "love" }, { "createTime": "xx-xx-xx xx:xx:xx", "like": 123123, "userAvatar": "", "description": "nihaoa ", "id": "29", "content": "zxc", "views": 999, "tags": "love" } ], "user": [ { ... } ], "xxx": [ { ... } ] } ```