ElasticSearch7安装与SpringBoot集成

ElasticSearch7安装

步骤

1.当前的版本是7.5.1,后面安装的插件会依赖es的版本,也可根据需要指定版本

2.es推荐安装在docker中,为演示方便,直接使用了windows版本

  • 进入解压目录elasticsearch-7.5.1,进入bin目录,双击elasticsearch.bat即可启动
image
image
  • 验证启动成功,直接在浏览器访问9200端口即可
image
  • 或者其他工具访问一下
image

常用指令

启动成功后,通过postman就可以向es执行操作命令

1.添加或更新索引及其文档

方法一(推荐):PUT /{索引}/{文档}/{id}, id为必传,若没有该id则插入数据,已有id则更新数据(若只传入索引,则创建索引)

方法二:POST /{索引}/{文档}/{id}, id可省略,如不传则由es生成

image

2.获取所有文档

GET /{索引}/{文档}/_search

如:http://127.0.0.1:9200/newindex/newdoc/_search

3.获取指定id文档

GET /{索引}/{文档}/{id}

如:http://127.0.0.1:9200/newindex/newdoc/1

4.模糊查询

GET /{索引}/{文档}/_search?q=*关键词*

如:http://127.0.0.1:9200/newindex/newdoc/_search?q=*王*

5.删除文档

DELETE /{索引}/{文档}/{id}

如:http://127.0.0.1:9200/newindex/newdoc/1

更多语句可参考官网

可视化工具

  • 安装ElasticSearch-Head,下载源码
git clone https://github.com/mobz/elasticsearch-head.git
  • 全局安装grunt项目构建工具
npm install -g grunt-cli
  • 安装依赖
cd elasticsearch-head/
npm install
  • 修改elasticsearch配置文件
vim ../elasticsearch-7.5.1/config/elasticsearch.yml
  • 追加跨域访问的配置,添加末尾即可
http.cors.enabled: true
http.cors.allow-origin: "*"
image
  • 启动ElasticSearch-Head
cd -    // 返回head根目录
grunt server
  • 浏览器访问查看:localhost:9100
image

IK分词器

下载

  1. github下载与或直接下载压缩包,我选择了第二种

  2. 解压后,将解压的文件夹拷贝到elasticsearch-7.5.1\plugins目录下,文件夹重名为ik

  3. 测试ik分词器的中文效果

image

扩展自定义分词器的内容

  1. 在\elasticsearch-7.5.1\plugins\ik\config目录下新建custom.dic;

  2. 添加自己的自定义的词汇;

  3. 修改同目录下的IKAnalyzer.cfg.xml文件,为<entry key="ext_dict">属性指定自定义的词典;

image
image
  1. 重启elasticsearch,效果如下:
image

整合SpringBoot

准备

  • 添加依赖Spring Data ElasticSearch
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  • 添加配置
spring:
  data:
    elasticsearch:
      cluster-nodes: 127.0.0.1:9300

代码编写

  • 新建实体类
@Data
@Accessors(chain = true)
@Document(indexName = "school", type = "student") // indexName为ES索引名,type为文档名
public class Student implements Serializable {

    // id标识
    // index=true代表是否开启索引,默认开启;
    // type字段类型
    // analyzer="ik_max_word"代表搜索的时候是如何分词匹配,为IK分词器最细颗粒度
    // searchAnalyzer = "ik_max_word"搜索分词的类型
    @Id
    private String id;
    
    @Field(type = FieldType.Keyword, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String name;

    private Integer age;

    @Field(type = FieldType.Double)
    private Double score;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String info;
}
  • 分页实体
@Data
@Accessors(chain = true)
public class QueryPage {

    /**
     * 当前页
     */
    private Integer current;

    /**
     * 每页记录数
     */
    private Integer size;
}
  • 数据持久层
public interface EsRepository extends ElasticsearchRepository<Student, String> {

    /**
     * 根据学生姓名或信息模糊查询
     */
    Page<Student> findByNameAndInfoLike(String name, String info, Pageable pageable);
}
  • 业务层接口及其实现
public interface EsService {

    /**
     * 插入
     */
    void add(Student student);
    
    /**
     * 批量插入
     */
    void addAll(List<Student> student);

    /**
     * 模糊查询
     */
    Page<Student> search(String keyword, QueryPage queryPage);
}
@Service
public class EsServiceImpl implements EsService {

    @Autowired
    private EsRepository esRepository;

    @Override
    public void add(Student student) {
        esRepository.save(student);
    }
    
    @Override
    public void addAll(List<Student> student) {
        esRepository.saveAll(student);
    }    

    @Override
    public Page<Student> search(String keyword, QueryPage queryPage) {
        // es默认索引从0开始,mp默认从1开始
        PageRequest pageRequest = PageRequest.of(queryPage.getCurrent() - 1, queryPage.getSize());
        return esRepository.findByNameOrInfoLike(keyword, keyword, pageRequest);
    }
}
  • 编写测试类
@SpringBootTest
public class EsServiceImplTest {

    @Autowired
    private EsService esService;

    @Test
    public void insert() {
        List<Student> students = new ArrayList<>();
        for (int i = 10; i <= 12; i++) {
            Student student = new Student();
            student.setId(i + "").setAge(10 + i).setName("王二狗" + i).setScore(72.5 + i).setInfo("大王派我来巡山" + i);
            students.add(student);
        }
        esService.addAll(students);
    }

    @Test
    public void fuzzySearch() {
        QueryPage queryPage = new QueryPage();
        queryPage.setCurrent(1).setSize(5);
        Page<Student> list = esService.search("二狗2", queryPage);
        list.forEach(System.out::println);
    }
}

MySql数据导入ElasticSearch

安装

配置

  • 解压压缩包
  • 拷贝\logstash-7.5.1\config\logstash-sample.conf在当前目录,重命名为logstash.conf
  • 修改为如下配置
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  jdbc {
    # MySql连接配置
    jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/springboot_es?characterEncoding=UTF8"
    jdbc_user => "root"
    jdbc_password => "1234"
    jdbc_driver_library => "D:\Develop_Tools_Others\logstash-7.5.1\mysql-connector-java-5.1.26.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_paging_enabled => "true"
    jdbc_page_size => "50000"
    # SQL查询语句,用于将查询到的数据导入到ElasticSearch
    statement => "select id,name,age,score,info from t_student"
    # 定时任务,各自表示:分 时 天 月 年 。全部为 * 默认每分钟执行
    schedule => "* * * * *"
  }
}
output {
  elasticsearch {
    hosts => "localhost:9200"
    # 索引名称
    index => "school"
    # 文档名称
    document_type => "student"
    # 自增ID编号
    document_id => "%{id}"
  }
  stdout {
    # JSON格式输出
    codec => json_lines
  }
}
  • 创建数据库springboot_es ,导入数据库脚本
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_student
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学生姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  `score` double(255, 0) NULL DEFAULT NULL COMMENT '成绩',
  `info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '信息',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_student
-- ----------------------------
INSERT INTO `t_student` VALUES (1, '小明', 18, 88, '好好学习');
INSERT INTO `t_student` VALUES (2, '小红', 17, 85, '天天向上');
INSERT INTO `t_student` VALUES (3, '王二狗', 30, 59, '无产阶级');

SET FOREIGN_KEY_CHECKS = 1;

运行

  • 先启动ES,再启动Es-head
  • 最后启动logstash,启动命令为:
D:\Develop_Tools_Others\logstash-7.5.1>.\bin\logstash.bat -f .\config\logstash.conf
  • 访问localhost:9600,查看启动成功
image
  • 查看控制台,是否同步数据
image
  • 最后可产看es-head,查看同步的数据
image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容