实战spring boot+elasticSearch实现数据高效搜索(二)

三、ElasticSearch-head 安装

上面我们介绍了 ElasticSearch 的安装,但是只能通过接口去查询数据,能不能通过可视化界面来查询数据呢?

ElasticSearch-head,就是一个提供可视化界面的 ElasticSearch 插件,使用 Html5 开发,本质上还是一个 nodejs 的工程,因此在使用之前需要先安装 nodeJs。

3.1、安装 nodeJs

下载nodeJS

wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.gz

解压下载包

tar -zxvf node-v10.9.0-linux-x64.tar.gz

移动解压之后的文件夹到/usr/local

mv node-v10.9.0-linux-x64 /usr/local/nodejs

创建软链接,让npm和node命令全局生效

ln -s /usr/local/nodejs/bin/node /usr/bin/node
ln -s /usr/local/nodejs/bin/npm /usr/bin/npm

查看nodejs是否安装成功

node -v
npm -v
3.2、 安装 elasticsearch-head

如果未安装git ,则先安装git工具

yum install –y git

查看git安装情况

git --version

从 gitHub 上拉取 elasticsearch-head 插件代码

git clone https://github.com/mobz/elasticsearch-head.git

进入elasticsearch-head文件夹

cd elasticsearch-head

因为npm安装非常非常慢,所以在这里先安装淘宝源地址,命令如下:

npm install cnpm -g --registry=https://registry.npm.taobao.org

创建cnpm软链接,不然执行下面执行命令会报错

ln -s /usr/local/nodejs/bin/cnpm /usr/local/bin/cnpm

使用cnpm命令下载安装项目所需要的插件

cnpm install

大概2分钟之后就安装好了,安装完成之后,修改配置信息

vim _site/app.js

将localhost换成elasticsearch的服务器地址,小编部署的这台是197.168.24.207。

换完之后,在elasticsearch-head目录下,输入如下命令,进入启动目录

cd node_modules/grunt/bin

使用如下命令启动服务,使elasticsearch-head服务在后台运行!

nohup ./grunt server &

最后,直接远程通过浏览器访问elasticsearch-head可视化管理界面,默认访问地址是ip:9100,访问结果如下!

至此,elasticsearch的安装包括可视化界面插件elasticsearch-head已经完成了!

四、SpringBoot 整合 ElasticSearch

对于 SpringBoot 来说,ElasticSearch 其实只是一个中间件,用途在于提供高效的搜索服务,比较幸运的是 SpringBoot 也为我们提供了 ElasticSearch 依赖库,添加依赖包,通过 JPA 访问非常方便,整合过程如下!

4.1、创建一个SpringBoot项目

在pom.xml中,添加依赖库 ElasticSearch 依赖包

<!--jpa 支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--elasticsearch-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

在application.properties中添加配置,其中节点名称cluster-name需要与上面的配置保持一致!

spring.data.elasticsearch.cluster-name=my-es
spring.data.elasticsearch.cluster-nodes=197.168.24.207:9300

4.1、编写 CURD

我们先写一个的实体类Student,借助这个实体类来完成基础的 CRUD 功能。

  • 新增实体类Student,其中indexName表示索引,type表示索引类别
@Data
@Accessors(chain = true)
@Document(indexName = "student", type = "school")
public class Student {

    private static final long serialVersionUID = 1l;

    @Id
    private String id;

    private String name;

    private String gender;

    private Integer age;
}

注意id字段是必须的,可以不写注解@Id!

  • 使用 JPA 作为数据持久层,接口继承自ElasticsearchRepository,同时新增两个自定义查询方法
public interface StudentRepository extends ElasticsearchRepository<Student, String> {

    /**
     * 通过姓名模拟查询学生信息
     * @param keyword
     * @return
     */
    List<Student> findByNameLike(String keyword);

    /**
     * 自定义查询,固定匹配查询学生信息
     * @param keyword
     * @return
     */
    @Query("{\"match_phrase\":{\"name\":\"?0\"}}")
    List<Student> findByNameCustom(String keyword);
}
  • 创建控制层,编写基础的 CRUD 功能
@RestController
@RequestMapping("/student")
public class StudentController {

    @Autowired
    private StudentRepository studentRepository;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    /**
     * 批量添加
     * @param students
     * @return
     */
    @PostMapping("/batchAdd")
    public void add(@RequestBody List<Student> students){
        studentRepository.saveAll(students);
    }

    /**
     * 添加
     * @param student
     * @return
     */
    @PostMapping("/add")
    public void add(@RequestBody Student student){
        studentRepository.save(student);
    }

    /**
     * 修改
     * @param student
     * @return
     */
    @PostMapping("/update")
    public void updateById(@RequestBody Student student){
        studentRepository.save(student);
    }

    /**
     * 删除
     * @param id
     * @return
     */
    @PostMapping("/delete/{id}")
    public void deleteById(@PathVariable String id){
        studentRepository.deleteById(id);
    }

    /**
     * 获取所有信息
     * @return
     */
    @GetMapping("/get")
    public Object getAll(){
        Iterable<Student> iterable = studentRepository.findAll();
        List<Student> list = new ArrayList<>();
        iterable.forEach(list :: add);
        return list;
    }

    /**
     * 查询指定ID
     * @param id
     * @return
     */
    @GetMapping("/get/{id}")
    public Object getById(@PathVariable String id){
        if(StringUtils.isEmpty(id)){
            return Result.error();
        }
        Optional<Student> studentOptional = studentRepository.findById(id);
        if(studentOptional.isPresent()){
            return studentOptional.get();
        }
        return null;
    }


    /**
     * 普通搜索
     * @param keyword
     * @return
     */
    @GetMapping("/search/name")
    public Object searchName(String keyword){
        List<Student> students = studentRepository.findByNameLike(keyword);
        return students;
    }

    /**
     * 自定义匹配
     * 普通搜索
     * @param keyword
     * @return
     */
    @GetMapping("/search/name/custom")
    public Object searchTitleCustom(String keyword){
        List<Student> students = studentRepository.findByNameCustom(keyword);
        return students;
    }

    /**
     * 高级搜索,可以自定义添加搜索字段
     * @param keyword
     * @return
     */
    @GetMapping("/top/search/name")
    public Object topSearchTitle(String keyword){
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(queryStringQuery(keyword))
                .build();
  //使用searchQuery进行搜索
        List<Student> students = elasticsearchTemplate.queryForList(searchQuery, Student.class);
        return students;
    }
}

4.2、CRUD 测试

CRUD 编写完了,我们验证一下是否可以正常操作,启动 springboot 项目,使用 postman 进行测试。

  • 批量新增、新增功能测试

执行之后,登录可视化界面查询界面,选择索引student,可以很清晰的看到数据已经进去了

  • 修改功能测试,修改时需要传入ID

王小贱从26岁修改为30岁,登录可视化界面查询数据也已经修改成功!

  • 删除功能测试,只需要传入ID

删除李四,登录可视化界面查询数据也已经删除成功!

  • 查询功能测试,查询所有数据
  • 查询功能测试,查询指定ID信息
  • 查询功能测试,普通模糊查询,ElasticSearch 会对关键词进行拆分,只要有包含关键字的都会查询出来,例如输入王张,会将包含王或者张的姓名信息查询出来
  • 查询功能测试,高级查询,这个是使用官方api提供的查询入口,可以在方法中进行自定义搜索

五、总结

elasticsearch 在海量数据查询方面,非常高效,本来想写在大量数据查询方面,数据库与 elasticsearch 的查询效率比对,由于篇幅较长会造成阅读体验降低,后在下篇文章中再次介绍这个部分。

对于想学习 elasticsearch 的新手,尤其是安装部分可能比较困难,因此花的编写时间比较多,后续的整合都比较简单,elasticsearch 真正的强大的地方在于高效信息搜索,本篇对 elasticsearch 的搜索只是做一个基础的介绍,具体的高级搜索方法大家可以参考官方文档 API,本篇可以看作为 elasticsearch 搜索服务入门的教程,可能也有遗漏的地方,欢迎网友点评、吐槽!

原文链接:,转发请注明来源!
「实战spring boot+elasticSearch实现数据高效搜索(二)」评论列表

发表评论