SpringBoot_EasyEs_Elasticsearch


SpringBoot_EasyEs_Elasticsearch

第一步

  • pom.xml 添加对应的架包
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot内集成了Elasticsearch,但此框架需要 Elasticsearch 的版本为 7.14.0,需要单独引用-->
<dependency>
    <groupId>cn.easy-es</groupId>
    <artifactId>easy-es-boot-starter</artifactId>
    <version>1.1.0</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 的 7.14.0 版本-->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.14.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.14.0</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>

第二步

  • 启动类上添加扫描路径
@SpringBootApplication
// ES 的扫描路径,如果项目里使用了 MP 那么 MP 的路径地址不能和 ES 的路径地址相同,否则会报错
@EsMapperScan("com.example.springbooteasyeselasticsearch.dao")
public class SpringbootEasyesElasticsearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootEasyesElasticsearchApplication.class, args);
    }
}

第三步

  • 定义实体类Document
@Data
@AllArgsConstructor
@NoArgsConstructor
// 指定索引名称
@IndexName("document")
public class Document implements Serializable {
    // 注解注解
    // IdType.NONE: 由ES自动生成,是默认缺省时的配置,无需您额外配置 推荐
    // IdType.UUID: 系统生成UUID,然后插入ES (不推荐)
    // IdType.CUSTOMIZE: 由用户自定义,用户自己对id值进行set,如果用户指定的id在es中不存在,则在insert时就会新增一条记录,如果用户指定的id在es中已存在记录,则自动更新该id对应的记录.
    @IndexId(type = IdType.NONE)
    private String id;

    // 字段注解,当我们需要对查询字段进行精确匹配,左模糊,右模糊,全模糊,排序聚合等操作时,需要该字段的索引类型为 keyword 类型
    @IndexField(fieldType = FieldType.KEYWORD)
    private String title;

    // 字段注解,当我们需要对字段进行分词查询时,需要该字段的类型为 text 类型,并且指定分词器(不指定就用 ES 默认分词器,效果通常不理想)
    @IndexField(fieldType = FieldType.TEXT)
    @HighLight
    private String content;

    // 字段注解,当同一个字段,我们既需要把它当 keyword 类型使用,又需要把它当 text 类型使用时,此时我们的索引类型为 keyword_text 类型
    // 当我们把该字段当做 keyword 类型查询时, ES 要求传入的字段名称为"字段名 .keyword",当把该字段当 text 类型查询时,直接使用原字段名即可
    // 如果一个字段的索引类型被创建为仅为 keyword 类型(如下图所示)查询时,则不需要在其名称后面追加 .keyword,直接查询就行
    @IndexField(fieldType = FieldType.KEYWORD_TEXT)
    private String description;

}

第四步

  • 定义 mapper 层实体类DocumentMapper
public interface DocumentMapper extends BaseEsMapper<Document> {
}

第五步

  • 定义 service 层接口IDocumentService
public interface IDocumentService {
    /**
     * 自定义接口
     * @param document
     * @return
     */
    Integer insert(Document document);
}

第六步

  • 实现 service 层接口DocumentServiceImpl
/**
 * 框架把基础的方法放在了 Mapper 层,从而取消了 Service 层
 * 如果调用基础的方法不需要对业务做复杂的处理,可以直接在 Controller 层直接使用 Mapper 层的方法
 * 如果需要对业务进行复杂的处理,可以在封装一层 Service 层
 */
@Service
public class DocumentServiceImpl implements IDocumentService {

    @Resource
    private DocumentMapper documentMapper;

    // 新增
    @Override
    public Integer insert(Document document) {
        return documentMapper.insert(document);
    }
}

第七步

  • 定义 controller 层测试类 DocumentController
@RestController
@Slf4j
@RequestMapping("/document")
public class DocumentController {

    /**
     * 封装 Service 层方法
     */
    @Resource
    private IDocumentService documentService;

    /**
     * 框架把基础的方法放在了 Mapper 层,从而取消了 Service 层
     * 如果调用基础的方法不需要对业务做复杂的处理,可以直接在 Controller 层直接使用 Mapper 层的方法
     * 如果需要对业务进行复杂的处理,可以在封装一层 Service 层
     */
    @Resource
    private DocumentMapper documentMapper;

    /**
     * 调用 Service 层方法
     * @param document
     * @return
     */
    @PostMapping("/insert")
    public Integer insert(@RequestBody Document document) {
        return documentService.insert(document);
    }

    /**
     * 直接调用 Mapper 层方法
     * @param document
     * @return
     */
    @PostMapping("/insertDocument")
    public Integer insertDocument(@RequestBody Document document) {
        return documentMapper.insert(document);
    }

    /**
     * 查询 ES 中所有的数据
     * @return
     */
    @PostMapping("/list")
    public List<Document> getListDocument() {
        LambdaEsQueryWrapper lambdaEsQueryWrapper = new LambdaEsQueryWrapper();
        lambdaEsQueryWrapper.matchAllQuery();
        return documentMapper.selectList(lambdaEsQueryWrapper);
    }

    /**
     * 浅分页,适合数据量在 1W 以内的数据分页
     * @return
     */
    @PostMapping("/page")
    public EsPageInfo<Document> getPageDocument() {
        LambdaEsQueryWrapper lambdaEsQueryWrapper = new LambdaEsQueryWrapper();
        lambdaEsQueryWrapper.matchAllQuery();
        return documentMapper.pageQuery(lambdaEsQueryWrapper, 1,10);
    }

    /**
     * 滚动查询
     * @return
     */
    @PostMapping("/sa_page")
    public SAPageInfo<Document> getSAPageDocument() {
        LambdaEsQueryWrapper<Document> lambdaEsQueryWrapper = EsWrappers.lambdaQuery(Document.class);
        lambdaEsQueryWrapper.size(10);
        lambdaEsQueryWrapper.orderByDesc(Document::getId);
        // 第一页的数据
        SAPageInfo<Document> saPageInfo = documentMapper.searchAfterPage(lambdaEsQueryWrapper, null, 5);
        System.out.println("saPageInfo = " + saPageInfo.getList() + "; saPageInfo.getSearchAfter() = " + saPageInfo.getSearchAfter() + "; saPageInfo.getNextSearchAfter() = " + saPageInfo.getNextSearchAfter());

        // 下一页的数据
        SAPageInfo<Document> searchAfterPage = documentMapper.searchAfterPage(lambdaEsQueryWrapper, saPageInfo.getNextSearchAfter(), 5);
        System.out.println("searchAfterPage = " + searchAfterPage.getList() + "; searchAfterPage.getSearchAfter() = " + searchAfterPage.getSearchAfter() + "; searchAfterPage.getNextSearchAfter() = " + searchAfterPage.getNextSearchAfter());
        return searchAfterPage;
    }
}

文章作者: L Q
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 L Q !
  目录