1.Elasticsearch 安装
1.1 下载软件
- Elasticsearch 的官方地址:https://www.elastic.co/cn/
- 这里选择下载 7.8.0 版本
- 下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
Elasticsearch 分为 Linux 和 Windows 版本,这里我们只是做测试,因此下载 windows 版本即可。
1.2 安装软件
Windows 版的 Elasticsearch 的安装很简单,解压即安装完毕,解压后的 Elasticsearch 的目录结构如下:
目录 | 含义 |
bin | 可执行脚本目录 |
config | 配置目录 |
jdk | 内置JDK目录 |
lib | 类库 |
logs | 日志目录 |
modules | 模块目录 |
plugins | 插件目录 |
1.3 安装 ik 中文分词器
🏠 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0
ik_max_word
:会将文本做最细粒度的拆分ik_smart
:会将文本做最粗粒度的拆分
将解压后的后的文件夹放入 ES
根目录下的 plugins
目录下。
1.4 启动ES
解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务:
⚠️ 注意:
9300
端口为 Elasticsearch 集群间组件的通信端口。9200
端口为浏览器访问的 http 协议 RESTful 端口。
💻 浏览器访问地址:http://localhost:9200
1.5 问题解决
- Elasticsearch 是使用 java 开发的,且 7.8 版本的 ES 需要 JDK 版本 1.8 以上,默认安装包带有 jdk 环境,如果系统配置 JAVA_HOME,那么使用系统默认的 JDK,如果没有配置使用自带的 JDK,一般建议使用系统配置的 JDK。
- 双击启动窗口闪退,通过路径访问追踪错误,如果是“空间不足”,请修改
config/jvm.options
配置文件
# 设置 JVM 初始内存为 1G。此值可以设置与-Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存 # Xms represents the initial size of total heap space # 设置 JVM 最大可用内存为 1G # Xmx represents the maximum size of total heap space -Xms1g -Xmx1g
2.Kibana 安装 & 使用
Elasticsearch 的开源分析可视化工具,与存储在 Elasticsearch 中的数据进行交互。
2.1 下载软件
Elasticsearch 下载的版本是 7.8.0,这里我们选择同样的 7.8.0 版本
下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana
2.2 安装软件
解压即安装完毕,解压后的 Kibana 的目录结构如下:
修改配置文件:kibana.yml
添加如下信息:
# 服务端口 server.port: 5601 # 国际化 - 中文 i18n.locale: "zh-CN" # ES 服务主机地址 elasticsearch.hosts: ["http://localhost:9200"] server.ssl.enabled: false
2.3 启动 Kibana
访问浏览器:http://localhost:5601/
3.实战开发-前提准备
3.1 开发背景
假设有一个博客模块,即有一个博客圈,用户可以通过搜索来获取与自己输入的关键字相关的数据列表,类似于CSDN的搜索。
由于只是 demo,因此这里会设计的很简单。
- 不支持通过作者进行搜索。
3.2 数据库表设计
# 如果存在 es_demo 数据库则删除 DROP DATABASE IF EXISTS `es_demo`; # 创建新数据库 CREATE DATABASE `es_demo`; # 创建一张博客表 CREATE TABLE `blog`( `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键id', `user_id` BIGINT NOT NULL COMMENT '用户id(雪花算法生成)', `title` VARCHAR(255) NOT NULL COMMENT '标题', `tags` VARCHAR(64) NOT NULL COMMENT '标签', `introduce` VARCHAR(512) NOT NULL COMMENT '介绍', `content` TEXT NOT NULL COMMENT '文章内容', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY(`id`), KEY `idx_user_create`(`user_id`,`create_time` DESC) )ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客信息表';
3.3 创建es索引与映射
PUT /blog { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "id": { "type": "keyword" }, "userId": { "type": "long" }, "title": { "analyzer": "ik_max_word", "search_analyzer": "ik_smart", "type": "text" }, "tags": { "analyzer": "ik_max_word", "search_analyzer": "ik_smart", "type": "text" }, "introduce":{ "analyzer": "ik_max_word", "search_analyzer": "ik_smart", "type": "text" }, "content":{ "analyzer": "ik_max_word", "search_analyzer": "ik_smart", "type": "text" }, "createTime":{ "format": "yyyy-MM-dd HH:mm:ss", "type": "date" }, "updateTime":{ "format": "yyyy-MM-dd HH:mm:ss", "type": "date" } } } }
3.4 es文档数据
其实按照正常的逻辑,应当在往数据库表添加记录后也写入到es中,可以使用java代码实现。但这里为了简单起见,我们直接往es中添加数据进行测试。
POST /blog/_doc/1000 { "id":1000, "userId":1626989073847750657, "title":"Java语言", "introduce":"Java的起源", "content":"Java最初是由任职于太阳微系统的詹姆斯-高斯林(James-Gosling)等人于1990年代初开发。最初被命名为Oak;当时发现Oak被其他公司注册了,不得不重新起名,当时他们正在咖啡馆喝着印尼爪哇(JAVA)岛出产的咖啡,有人提议就叫JAVA怎么样,然后就这样定下来了。", "tags":"编程,java,语言", "createTime":"2023-03-23 00:40:20", "updateTIme":"2023-03-23 00:40:20" } POST /blog/_doc/1001 { "id":1001, "userId":1626989073847750657, "title":"C语言", "introduce":"C的起源", "content":"C语言是由美国贝尔实验室的Dennis Ritchie于1972年设计发明的,最初在UNIX操作系统的DEC PDP-11计算机上使用。它由早期的编程语言BCPL(Basic Combind Programming Language)发展演变而来。", "tags":"编程,C,语言", "createTime":"2023-03-23 00:40:20", "updateTIme":"2023-03-23 00:40:20" } POST /blog/_doc/1002 { "id":1002, "userId":1626989073847750657, "title":"C与JAVA语言", "introduce":"c和java关系", "content":"C语言和Java都是计算机编程语言,但它们有很多不同之处。C语言是一种面向过程的编程语言,而Java是一种面向对象的编程语言。", "tags":"C,java,语言", "createTime":"2023-03-23 00:40:20", "updateTIme":"2023-03-23 00:40:20" }
4.实战开发-后端代码
4.1 pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fox</groupId> <artifactId>elasticsearch-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.0</version> </dependency> <!--fastjson依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.33</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.7</version> </dependency> </dependencies> </project>
4.2 application.yml配置
server: # 服务端口 port: 9999 elasticsearch: # es访问ip hostname: 127.0.0.1 # es访问port port: 9200 blog: # 访问索引 index: blog # 搜索返回字段 source_fields: id,userId,title,introduce,createTime