Elasticsearch安装,Springboot整合Elasticsearch详细教程

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够实现近乎实时的搜索。

Elasticsearch官网icon-default.png?t=N7T8https://www.elastic.co/cn/

目录

第一步:下载Elasticsearch

下载7.6.2版本

下载其他版本

第二步:安装Elasticsearch

第三步:安装kibana

第四步:Springboot整合Elasticsearch

1、创建springboot项目

2、在pom.xml中添加依赖

3、修改配置文件

4、创建数据库和es的实体类

5 、创建mapper接口及映射文件

6、创建elasticsearch的查询接口

7、开启mapper包扫描

第五步:从mysql导入数据到es

第六步:学习DSL

1、无条件查询,默认返回10条数据

2、指定返回的数据条数

3、指定查询字段

4、分页查询

5、查询指定ID的数据

6、删除索引

7、条件查询

第七步:在java中使用elasticsearch

1、通过ElasticsearchRepository

2、通过ElasticsearchRestTemplate


这篇文章主要简单介绍一下Elasticsearch,Elasticsearch的java API博主也在学习中,文章会持续更新~

第一步:下载Elasticsearch

下载7.6.2版本

这篇文章使用的Elasticsearch版本是7.6.2,可以通过以下网盘链接下载,里面有7.6.2版本的ik分词器,链接永久有效。

elasticsearch7.6.2下载icon-default.png?t=N7T8https://pan.baidu.com/s/1D_HS8w_WW3dfQllGzNGv8A?pwd=p3aa

下载其他版本

如需安装其他版本,可在官网自行安装。

1、访问官网,在首页点击页面上方的【文档】

2、点击All Elastic docs

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第1张图片

3、点击选择other versions

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第2张图片

4、在左侧版本列表选择对应的版本,点击对应链接,比如选择7.6.2版本

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第3张图片

5、然后点击Installing the Elastic Stack

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第4张图片

6、 在页面找到Elasticsearch,点击后面的install instructions(安装说明)

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第5张图片

7、让后找到对应操作系统,比如windows,只需要点击Install Elasticsearch with .zip on Windows

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第6张图片

8、在打开的页面向下滚动,找到Download and install the .zip package

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第7张图片

9、点击后面的zip压缩文件链接开始下载https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第8张图片

第二步:安装Elasticsearch

把下载下来的压缩包解压到系统盘,建议解压到D盘,如图

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第9张图片

打开bin目录,双击下面的文件启动Elasticsearch

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第10张图片

稍微等一下,启动完成后访问localhost:9200,如果返回了以下格式的数据,说明elasticsearch到此安装完成

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第11张图片

第三步:安装kibana

问了方便使用elasticsearch的Query DSL(Domain Specified Language,领域专用语言),需要安装一下Elasticsearch的Kibana可视化控制台管理工具。

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第12张图片

安装步骤和第二步类似,这里就不赘述了,安装完成后,还是解压到D盘

然后修改一下config目录下的kibaba.yml配置文件

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第13张图片

使用文本编辑器打开yml文件,找到以下内容并取消注释,修改为对应的值

server.port: 5601

server.host: "localhost"

server.name: "heyunlin" # 这个可以随意取名

elasticsearch.hosts: ["http://localhost:9200"] # elasticsearch服务器的地址

i18n.locale: "zh-CN" # 页面使用中文

最后打开bin目录,双击kibaba.bat启动kibaba

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第14张图片

启动完成后,在浏览器地址栏输入http://localhost:5601/app/kibana#/dev_tools/console

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第15张图片

然后就可以在左边写我们的DSL了,点击右边的运行按钮即可直接执行查询语句。

第四步:Springboot整合Elasticsearch

这一步是java程序员最注重的,怎么在java中使用elasticsearch。

1、创建springboot项目

首先,创建一个springboot项目elastic

2、在pom.xml中添加依赖

完成的pom文件如下,可以直接复制。



    4.0.0

    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.4.RELEASE
        
    

    com.example
    elastic
    0.0.1-SNAPSHOT

    
        1.8
        1.1.21
        8.0.28
        1.18.22
        2.2.2
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            mysql
            mysql-connector-java
            ${mysql.version}
        

        
            org.projectlombok
            lombok
            ${lombok.version}
        

        
            com.alibaba
            druid
            ${druid.version}
        

        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            ${mybatis.version}
        

        
            org.springframework.boot
            spring-boot-starter-data-elasticsearch
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

3、修改配置文件

修改elastic.yml,复制以下内容

spring:
  # 数据库配置
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/elastic
    type: com.alibaba.druid.pool.DruidDataSource

server:
  port: 9021

mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml

4、创建数据库和es的实体类

创建entity包,然后创建Song.java,@Document(indexName = "songs")注解指定索引名为songs,@Field注解配置字段的类型,只有text类型的字段会被分词。

package com.example.elastic.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * 歌曲
 * @author heyunlin
 * @version 1.0
 */
@Data
@Document(indexName = "songs")
public class Song {

    @Id
    @Field(type= FieldType.Keyword)
    private String id;

    /**
     * 歌曲名
     */
    @Field(type= FieldType.Text, analyzer = "ik_max_word")
    private String name;

    /**
     * 歌手
     */
    @Field(type= FieldType.Text, analyzer = "ik_max_word")
    private String singer;

    /**
     * 描述信息
     */
    @Field(type= FieldType.Text, analyzer = "ik_max_word")
    private String note;

    /**
     * 歌曲文件
     */
    private String url;

    /**
     * 歌曲文件是否存在/是否已上传
     */
    @Field(type= FieldType.Long)
    private Integer uploaded;

//    /**
//     * 最后一次修改时间
//     */
//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
//    private LocalDateTime lastUpdateTime;
}

5 、创建mapper接口及映射文件

创建mapper包,创建一个接口SongMapper.java

package com.example.elastic.mapper;

import com.example.elastic.entity.Song;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@Repository
public interface SongMapper {

    List selectAll();
}

在resources目录下创建mapper包,然后创建SongMapper.xml





    
        
        
        
        
        
        

    

    

6、创建elasticsearch的查询接口

创建一个接口继承ElasticsearchRepository接口,该接口的第一个参数类型为实体类型,二个参数类型是实体类的ID属性的数据类型,在这里是String。

package com.example.elastic.repository;

import com.example.elastic.entity.Song;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**
 * @author heyunlin
 * @version 1.0
 */
@Repository
public interface SongRepository extends ElasticsearchRepository {

}

7、开启mapper包扫描

package com.example.elastic.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

/**
 * Mybatis配置类
 * @author heyunlin
 * @version 1.0
 */
@Configuration
@MapperScan(basePackages = "com.example.elastic.mapper")
public class MybatisConfig {

}

第五步:从mysql导入数据到es

通过上一步骤,已经成功完成es的整合,接下来查询mysql数据库,把mysql的数据保存到es中。

接下来,需要创建数据库elastic,然后运行sql脚本,SQL脚本文件在文章末尾的项目链接对应项目上,在这里就不贴出来了,太长了。

修改测试类,运行initData()方法

package com.example.elastic;

import com.example.elastic.entity.Song;
import com.example.elastic.mapper.SongMapper;
import com.example.elastic.repository.SongRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class ElasticApplicationTests {

    @Autowired
    private SongMapper songMapper;

    @Autowired
    private SongRepository repository;

    @Test
    void initData() {
        List list = songMapper.selectAll();

        for (Song song : list) {
            repository.save(song);
        }
    }

}

第六步:学习DSL

完成第五步之后,我们的es里已经有了803条歌曲的数据了,接下来学习DSL的使用,DSL就是一种查询语言。

DSL的格式,其中songs是指es中的索引名,我们歌曲对饮的索引名通过注解指定了songs

GET /songs/_search {json请求体数据}

接下来介绍一下es中常用的DSL

1、无条件查询,默认返回10条数据

GET /songs/_search
{
  "query": {
    "match_all": {}
  }
}

返回的数据格式:为了避免太占位置,只查询了5条记录。

hits里是查询结果信息,hits.total.value表示符合查询条件的总记录数,hits.hits表示的是返回的数据,_source里是具体的数据。

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 808,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "songs",
        "_type" : "_doc",
        "_id" : "20210522154945",
        "_score" : 1.0,
        "_source" : {
          "_class" : "com.example.elastic.entity.Song",
          "id" : "20210522154945",
          "name" : "诺言",
          "singer" : "陈洁丽",
          "note" : "《百变机兽之洛洛历险记》动画ED",
          "uploaded" : 0
        }
      },
      {
        "_index" : "songs",
        "_type" : "_doc",
        "_id" : "20210522155349",
        "_score" : 1.0,
        "_source" : {
          "_class" : "com.example.elastic.entity.Song",
          "id" : "20210522155349",
          "name" : "快乐星猫",
          "singer" : "牛奶咖啡",
          "note" : "《快乐星猫》动画主题曲",
          "uploaded" : 0
        }
      },
      {
        "_index" : "songs",
        "_type" : "_doc",
        "_id" : "20210522155118",
        "_score" : 1.0,
        "_source" : {
          "_class" : "com.example.elastic.entity.Song",
          "id" : "20210522155118",
          "name" : "无别",
          "singer" : "张信哲",
          "note" : "《天官赐福》动画OP",
          "uploaded" : 0
        }
      },
      {
        "_index" : "songs",
        "_type" : "_doc",
        "_id" : "20210522154331",
        "_score" : 1.0,
        "_source" : {
          "_class" : "com.example.elastic.entity.Song",
          "id" : "20210522154331",
          "name" : "爱一点",
          "singer" : "王力宏、章子怡",
          "note" : "",
          "uploaded" : 0
        }
      },
      {
        "_index" : "songs",
        "_type" : "_doc",
        "_id" : "20210522154139",
        "_score" : 1.0,
        "_source" : {
          "_class" : "com.example.elastic.entity.Song",
          "id" : "20210522154139",
          "name" : "多肉少女",
          "singer" : "赵芷彤Cassie",
          "note" : "",
          "uploaded" : 0
        }
      }
    ]
  }
}

2、指定返回的数据条数

以下查询语句将会返回20条数据,而非默认的10条

GET /songs/_search
{
  "query": {
    "match_all": {}
  },
  "size": 20
}

3、指定查询字段

_source是一个数组,指定需要返回哪些字段,设置为false则不会返回数据。

GET /songs/_search
{
  "query": {
    "match_all": {}
  },
  "size": 5, 
  "_source": ["name", "singer", "note"]
}

4、分页查询

通过from+size实现分页查询,下面查询了第6-10条记录,相当于mysql中的limit 5, 5(和mysql类似,from默认为0)

GET /songs/_search
{
  "query": {
    "match_all": {}
  },
  "from": 5,
  "size": 5
}

5、查询指定ID的数据

GET /songs/_doc/20210522155349

6、删除索引

DELETE /songs

7、条件查询

以下是查询歌曲名中包含“爱”字的歌曲

GET /songs/_search
{
  "query": {
    "match": {
      "name": "爱"
    }
  }
}

第七步:在java中使用elasticsearch

上面已经介绍了以下es的简单使用,接下来通过java来操作es。

1、通过ElasticsearchRepository

ElasticsearchRepository有一套标准的方法命名规范,比如findByXxx(),ElasticsearchRepository会自动为其实现类中符合命名规范的方法生成对应的DSL语句。

我们在之前的SongRepository接口中声明一个findByName()方法,根据歌曲名查询歌曲列表。

package com.example.elastic.repository;

import com.example.elastic.entity.Song;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@Repository
public interface SongRepository extends ElasticsearchRepository {

    List findByName(String name);

}

然后通过测试类测试该方法

package com.example.elastic;

import com.example.elastic.entity.Song;
import com.example.elastic.repository.SongRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@SpringBootTest
public class ElasticsearchRepositoryTests {

    @Autowired
    private SongRepository songRepository;

    @Test
    void test() {
        List list = songRepository.findByName("爱");

        System.out.println("共查询到" + list.size() + "条记录。");
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

        for (Song song : list) {
            System.out.println(song);
        }
    }

}

如图,查询出来73首符合条件的歌曲。

Elasticsearch安装,Springboot整合Elasticsearch详细教程_第16张图片

2、通过ElasticsearchRestTemplate

下面通过简单的案例来介绍ElasticsearchRestTemplate的使用,相关的API博主也在学习中。

package com.example.elastic;

import com.example.elastic.entity.Song;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.Query;

import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@SpringBootTest
public class ElasticsearchRestTemplateTests {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Test
    void test() {
        SearchHits search = elasticsearchRestTemplate.search(Query.findAll(), Song.class);
        List> searchHits = search.getSearchHits();

        for (SearchHit searchHit : searchHits) {
            System.out.println(searchHit);
        }
    }

    @Test
    void testIndexOps() {
        IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Song.class);

        System.out.println(indexOperations.exists());
    }

}

好了,文章就分享到这里了,项目已开源,按需获取~

Springboot整合Elasticsearchicon-default.png?t=N7T8https://gitee.com/he-yunlin/elastic.git

你可能感兴趣的:(elasticsearch,spring,boot,大数据)