这里用的es7.8版本,该版本最好和你安装的版本一致

 <!--spring-data集成es-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <!-- es插件 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.8.0</version>
        </dependency>
        <!--es高级客户端-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.8.0</version>
        </dependency>

对应的实体类,需要注意这里的indexName一定要是小写的


/**
 * 实体类
 */
@Data
@ApiModel(value = "Users对象", description = "实体对象")
//索引名,分片,副本
@Document(indexName = "user",shards = 3,replicas = 1)
public class Users {
    /**
     * 账号
     */
    private String id;


    /**
     * 账号
     */
    @ApiModelProperty(value = "账号", name = "account")
    @Field(type = FieldType.Keyword)//关键词不分词
    private String account;

    /**
     * 用户名
     */
    @ApiModelProperty(value = "用户名", name = "username")
    private String username;

    /**
     * 临时添加的,
     */
    @ApiModelProperty(value = "年龄", name = "age")
    private Integer age;


    /**
     * 密码
     */
    @ApiModelProperty(value = "密码", name = "password")
    @Field(type = FieldType.Keyword,index = false)//关键词不分词,且不作为索引查询
    private String password;

    /**
     * 描述
     */
    @ApiModelProperty(value = "描述", name = "described")
    private String described;

    /**
     * 创建人
     */
    @ApiModelProperty(value = "创建人", name = "cname")
    private String cname;

    /**
     * 逻辑删除
     */
    @ApiModelProperty(value = "逻辑删除", name = "deleted")
    @TableLogic
    @TableField(value = "DELETED", fill = FieldFill.INSERT, jdbcType = JdbcType.VARCHAR)
    private String deleted;

}

一些简单的查询可以直接用ElasticsearchRepository中提供的方法,具体需求可以根据实体类的属性和关键字来拼接


@Repository
public interface EsService extends ElasticsearchRepository<Users,Long>  {

    /**
     * 查询用户名为username的用户
     * @param username
     * @return
     */
    List<Users> findByUsername(String username);

    /**
     * 查询用户名不是username的所有用户
     * @param username
     * @return
     */
    List<Users> findByUsernameNot(String username);



}

如果想要实现分页、排序、多条件查询就需要使用ElasticsearchOperations
(注意:
① ElasticsearchRestTemple是ElasticsearchOperations的子类的子类
② 在ES7.x以下的版本使用的是ElasticsearchTemple,7.x以上版本已弃用ElasticsearchTemple,使用ElasticsearchRestTemple替代

  @Autowired
    private ElasticsearchOperations elasticsearchOperations;
 /**
     * 模糊、分页、排序查询
     * @return
     */
    @ApiOperation(value="模糊、分页、排序查询")
    @GetMapping("getLikeUser")
    public BaseResultModel getLikeUser(Users users,  @RequestParam Integer pageNumber,@RequestParam Integer pageSize) {
        if (pageNumber<0){
            pageNumber=0;
        }
        if (pageSize<=0){
            pageSize=20;
        }
        Pageable pageable = PageRequest.of(pageNumber, pageSize);
        QueryBuilder queryBuilder=null;
        if (users.getAccount()!=null&&users.getAccount().trim().length()>0){
            queryBuilder=QueryBuilders.matchQuery("account",users.getAccount());
        }
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withPageable(pageable)
                .build();

        SearchHits<Users> search = elasticsearchOperations.search(build, Users.class);
        System.out.println("检索后的总分页数目为:" + search.getTotalHits());
        List<SearchHit<Users>> searchHits = search.getSearchHits();

        return BaseResultModel.success(searchHits);
    }


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐