Spring boot 整合 Elasticsearch

引入依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--SpringBoot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!--elasticsearch-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.1.1</version>
        </dependency>
        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!-- lombok简化注解 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.6</version>
        </dependency>
        <!-- 阿里FastJson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.39</version>
        </dependency>
    </dependencies>

添加配置文件application.properties

spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.local=false
spring.data.elasticsearch.repositories.enabled=true

entity类

/**
 * @author 向振华
 * @date 2018/11/21 15:48
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
//es注解,设置索引名称以及类型
@Document(indexName = "xzhes", type = "info")
public class EsEntity {

    //id(需要添加@Id注解,或会自动识别名称为id的字段为id,其余字段没有限制)
    @Id
    private Integer id;
    //名称
    private String name;
    //性别
    private String sex;
    //年龄
    private Integer age;

}

Repository类

/**
 * @author 向振华
 * @date 2018/11/21 16:53
 */
public interface EsRepository extends ElasticsearchRepository<EsEntity, Integer> {
}

service类

/**
 * @author 向振华
 * @date 2018/11/21 15:54
 */
public interface EsService {

    void save(EsEntity esEntity);

    List<EsEntity> select(Search search);

}
/**
 * @author 向振华
 * @date 2018/11/22 10:08
 */
@Service
public class EsServiceImpl implements EsService {

    @Resource
    private EsRepository esRepository;

    @Override
    public void save(EsEntity esEntity) {
        esRepository.save(esEntity);
    }

    @Override
    public List<EsEntity> select(Search search) {

        //创建builder
        BoolQueryBuilder builder = QueryBuilders.boolQuery();
        //builder下有must、should以及mustNot 相当于sql中的and、or以及not
        //设置“名称”模糊搜索
        if (search.getName()!=null) {
            builder.must(QueryBuilders.matchPhraseQuery("name", search.getName()));
        }
        //设置“性别”
        if (search.getSex()!=null) {
            builder.must(new QueryStringQueryBuilder(search.getSex()).field("sex"));
        }
        //按照年龄从高到低
        FieldSortBuilder sort = SortBuilders.fieldSort("age").order(SortOrder.DESC);
        //设置分页(拿第一页,一页显示两条)。注意!es的分页api是从第0页开始的(坑)
        PageRequest page = new PageRequest(0, 2);

        //构建查询
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //将搜索条件设置到构建中
        nativeSearchQueryBuilder.withQuery(builder);
        //将分页设置到构建中
        nativeSearchQueryBuilder.withPageable(page);
        //将排序设置到构建中
        nativeSearchQueryBuilder.withSort(sort);
        //生产NativeSearchQuery
        NativeSearchQuery query = nativeSearchQueryBuilder.build();

        //执行
        Page<EsEntity> searchs = esRepository.search(query);

        //获取总条数(前端分页需要使用)
        int total = (int) searchs.getTotalElements();

        //获取查询到的数据内容
        List<EsEntity> content = searchs.getContent();

        return content;
    }
}

搜索实体类

/**
 * @author 向振华
 * @date 2018/11/22 11:02
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Search {
    //名称
    @ApiModelProperty(value = "名称")
    private String name;

    //性别
    @ApiModelProperty(value = "性别")
    private String sex;

    //年龄
    @ApiModelProperty(value = "年龄")
    private Integer age;
}

测试controller

/**
 * @author 向振华
 * @date 2018/11/21 16:05
 */
@Api(tags = "测试")
@RequestMapping("test")
@RestController
public class TestController {

    @Resource
    private EsService esService;

    @ResponseBody
    @GetMapping("/add")
    public String add(EsEntity esEntity) {
        esService.save(esEntity);
        return "success";
    }

    @ResponseBody
    @GetMapping("/select")
    public String select(Search search) {
        List<EsEntity> entities = esService.select(search);
        return JSON.toJSONString(entities);
    }
}

启动类

/**
 * 启动类(需要先启动elasticsearch.bat)
 * @author 向振华
 * @date 2018/11/21 15:16
 */
@SpringBootApplication
public class ApplicationMain {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationMain.class, args);
    }
}

注意:

1.启动项目之前需要先启动elasticsearch.bat。

2.可以用chrome浏览器装elasticsearch head插件进行查看。

3.elasticsearch下载地址:https://www.elastic.co/downloads/elasticsearch

4.本项目地址:https://github.com/xxiangzh/es-server

猜你喜欢

转载自blog.csdn.net/Anenan/article/details/84337541