<artifactId>spring-boot-starter-test</artifactId>
</dependency>
#### 1.1.2 配置 application.yml 文件
server:
port: 9000
Spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/es_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 123
开启驼峰命名匹配映射
mybatis:
configuration:
map-underscore-to-camel-case: true
#### 1.1.3 创建实体类时可能出现的问题
>
> 说明:SpringBoot项⽬启动提示This primary key of "id" is primitive !不建议如此请使⽤包装类in Class: "com.yx.pojo.JobInfo"。
>
>
> 1.解决⽅法:
>
>
> 使⽤包装类替换基本数据类型。将id字段封装成Long类型或Integer类型,具体选择什么类型取 决于数据库中该id字段的类型。
>
>
> 2.警告原因:
>
>
> 如果⽤long的话id的默认值会是0,会出现⼀些问题,⽐如在MyBatis-Plus使⽤save()⽅法时就 不能使⽤算法⽣成id了,这样会⽣成id为0的数据,如果有唯⼀或者主键约束的话,下⼀次⽣成就会报错。
>
>
>
### 1.2 创建索引
#### 1.2.1 创建索引实现/查询索引
package com.example.lucenedemo.test;
import com.example.lucenedemo.pojo.JobInfo;
import com.example.lucenedemo.service.JobInfoService;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.;
import org.apache.lucene.index.;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.File;
import java.io.IOException;
import java.util.List;
@SpringBootTest
public class LuceneTests {
@Autowired
private JobInfoService jobInfoService;
@Test
public void createIndex() throws IOException { // 数据库中查询数据、给其建立索引
// 1.指定索引文件存储位置:
Directory directory = FSDirectory.open(new File("E:/B/index(23-07-03)"));
// 2.配置分词器
// Lucene 提供的标准分词器
// Analyzer analyzer = new StandardAnalyzer();
// IK分词器
Analyzer analyzer = new IKAnalyzer();
// 指定分词器版本,Version.LATEST 表示最新
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
// 3.创建一个用来写入索引的数据对象:IndexWriter
// 参数1:索引写入的目标文件位置,参数2:表示按照哪一个分词器写出数据
IndexWriter indexWriter = new IndexWriter(directory, config);
// 删除指定目录下所有的索引数据
indexWriter.deleteAll();
// 4.从MySql数据库中查询到的数据,交给Lucene写入index目录下,并同时创建索引
List<JobInfo> jobInfos = jobInfoService.selectAll();
// 循环遍历集合
for (JobInfo jobInfo : jobInfos) {
// 创建文档对象:Document是用来存储数据库中的一条数据
Document document = new Document();
// document 总添加field(数据库字段信息):数据类型、取值
/**
* 字段类型:stord是否存储。YES表示永久在索引库中存储,NO:表示不永久保存
*/
document.add(new LongField("id",jobInfo.getId(), Field.Store.YES));
document.add(new TextField("companyName",jobInfo.getCompanyName(),Field.Store.YES));
document.add(new TextField("companyAddr",jobInfo.getCompanyAddr(),Field.Store.YES));
document.add(new IntField("SalaryMin",jobInfo.getSalaryMin(),Field.Store.YES));
document.add(new IntField("salaryMax",jobInfo.getSalaryMax(),Field.Store.YES));
document.add(new StringField("url",jobInfo.getUrl(),Field.Store.YES));
document.add(new StringField("time",jobInfo.getTime(),Field.Store.YES));
// 将当前的document文档写入索引库中
indexWriter.addDocument(document);
}
// 关闭资源
indexWriter.close();
}
@Test
// 查询索引
public void queryIndex() throws IOException {
// 1.指定文件位置
Directory directory = FSDirectory.open(new File("E:/B/index(23-07-03)"));
// 2,创建一个读取索引文件数据的对象
IndexReader indexReader = DirectoryReader.open(directory);
// 3.创建一个搜索索引中数据的对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4.创建一个被查询的Term:词。制定了被搜索的内容、取值
Query query = new TermQuery(new Term("companyName", "北京"));
// 通过IndexSearcher来完成
TopDocs search = indexSearcher.search(query, 10);
System.out.println("符合条件的文档总数:" + search.totalHits);
System.out.println("maxScore:" + search.getMaxScore());
System.out.println("======================");
for (ScoreDoc scoreDoc : search.scoreDocs) {
// 获取文档的id
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
System.out.println("id:" + document.get("id"));
System.out.println("companyName:" + document.get("companyName"));
System.out.println("salaryMax:" + document.get("salaryMax"));
System.out.println("time:" + document.get("time"));
System.out.println("url:" + document.get("url"));
System.out.println("======================");
}
// indexReader.close();
}
}
中⽂分词器已在 pom.xml 中添加
com.janeluo ikanalyzer 2012_u6 ```
2 ELK(Elasticsearch、Logstash、Kibana)使用
2.1 Elasticsearch安装配置和启动
2.1.1 Elasticsearch版本
⽬前Elasticsearch最新的版本是8.x,企业内⽬前⽤的⽐较多是6.x,我们以6.2.4进⾏讲解,需要JDK 1.8及以上版 本。为了快速看到效果我们直接在本地操作系统上安装Elasticsearch。
2.1.1 Elasticsearch安装配置
1.在Elasticsearch官⽹下载https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-4的是zip格式 的Elasticsearch安装包(⽆论Window系统还是Mac系统)。
2.将下载的elasticsearch-6.2.4.zip压缩包解压到任意⼀个没有中⽂没有空格的⽬录下。
3.在任意⼀个没有中⽂没有空格的⽬录下创建es-config⽬录,并在该⽬录下创建es-9000⽬录,最后在es-9000⽬ 录下创建data和logs⽬录。
4.修改Elasticsearch索引数据和⽇志数据存储的路径。打开elasticsearch-6.2.4/config/⽬录下的elasticsearch.yml 配置⽂件进⾏路径的配置(大概在 30~40 行之间)。
# Mac系统下配置⽅式
path.data: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9000/data
path.logs: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9000/logs
# Windows系统下配置⽅式
path.data: D:\es-config\es-9000\data
path.logs: D:\es-config\es-9000\logs
说明:操作系统不同,Paths的路径配置有区别,以上两种⽅式根据本地操作系统⼆选其⼀。
2.2 Elasticsearch启动
1.进⼊elasticsearch-6.2.4/bin/⽬录下通过启动⽂件来启动Elasticsearch。
# Mac系统下启动Elasticsearch⽅式 - 在终端执⾏下⾯的⽂件
./elasticsearch
# Windows系统下启动Elasticsearch⽅式 - 双击下⾯的⽂件运⾏
elasticsearch.bat
2.启动成功后,终端将输出以下的信息。可以看到绑定了两个端⼝。
- 9300:集群节点间通讯接⼝,接收TCP协议。
- 9200:客户端访问接⼝,接收HTTP协议。
3.我们在浏览器中访问http://127.0.0.1:9200地址进⾏测试,如果看到以下结果表示Elasticsearch启动成功。
{
"name" : "M76Rype",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "FOOWRqrPQVGF5jRlUX7H2Q",
"version" : {
"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
2.3 Elasticsearch启动失败部分原因
解决的⽅法是:修改虚拟机内存的⼤⼩。
1.找到elasticsearch-6.2.4/config/下的jvm.options配置⽂件,默认Xms和Xmx的初始值都为1G。
- Xms是指设定程序启动时占⽤内存⼤⼩。⼀般来讲,⼤点程序会启动的快⼀点,但是也可能会导致机器暂时变 慢。
- Xmx是指设定程序运⾏期间最⼤可占⽤的内存⼤⼩。如果程序运⾏需要占⽤更多的内存,超出了这个设置 值,就会抛出OutOfMemory异常。
2.将Xms和Xmx的初始值进⾏修改,值都设置成256m。
-Xms256m
-Xmx256m
3.再重新通过启动⽂件来启动Elasticsearch进⾏测试。
2.4 安装Kibana
2.4.1 Kibana下载安装
1.Node.js安装
因为Kibana依赖于Node.js,需要在系统上先安装Node.js。具体Node.js的安装步骤在这⾥不展开讲解。
2.Kibana安装
1.访问https://www.elastic.co/cn/downloads/past-releases/kibana-6-2-4⽹址,根据操作系统下载对应的Kibana 安装包。注意下载的Kibana版本和Elasticsearch版本保持⼀致。
- Mac版:kibana-6.2.4-darwin-x86_64.tar.gz
- Windows版:kibana-6.2.4-windows-x86_64.zip
2.将下载的Kibana压缩包解压到任意⼀个没有中⽂没有空格的⽬录下。
2.4.2 Kibana配置运⾏
1.进⼊Kibana安装⽬录下的config⽬录,修改kibana.yml⽂件,添加Elasticsearch服务地址的配置(注释放开即 可。大概在21行左右)。
# The URL of the Elasticsearch instance to use for all your queries.
elasticsearch.url: "http://localhost:9200"
2.进⼊Kibana安装⽬录下的bin⽬录,通过运⾏启动⽂件来启动Kibana。前提是先启动Elasticsearch服务,再启动 Kibana服务。
# Mac系统下启动Kibana⽅式 - 在终端执⾏下⾯的⽂件
./kibana
# Windows系统下启动Kibana⽅式 - 双击下⾯的⽂件运⾏
kibana.bat
3.Kibana启动成功后⻅下。
4.通过运⾏结果发现Kibana的监听端⼝是5601。然后访问http://127.0.0.1:5601地址进⾏测试。
2.4.3 Kibana控制台
1.在Kibana控制台左侧菜单列表中选择【DevTools】选项,即可进⼊控制台⻚⾯。
2.在⻚⾯右侧,我们就可以输⼊请求,然后点击运⾏按钮,就可以访问Elasticsearch了。
2.5 安装Head插件
2.5.1 elasticsearch-head安装
elasticsearch-head的安装基于⾕歌浏览器进⾏介绍。
1.通过https://fifiles.cnblogs.com/fifiles/sanduzxcvbnm/elasticsearch-head.7z⽹址下载elasticsearch-head.7z 压缩包。
2.将elasticsearch-head.7z解压到任意⼀个没有中⽂没有空格的⽬录下。
3.在⾕歌浏览器中点击【扩展程序】-【加载已解压的压缩程序】选项,找到elasticsearch-head⽂件夹,点击打开 即可进⾏安装。
4.访问extension://ffmkiejjmecolpfloofpjologoblkegm/elasticsearch-head/index.html地址将看到以下 窗⼝表示安装成功。
2.6 安装IK分词器
IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases。
2.6.1 IK分词器安装
1.访问https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v6.2.4地址下载IK分词器zip安装包。
2.将下载的elasticsearch-analysis-ik-6.2.4.zip的压缩包解压到elasticsearch-6.2.4/plugins/⽬录下,并将解压后的 ⽬录重命名成analysis-ik。
3.重新启动Elasticsearch服务即可加载IK分词器,然后再重启Kibana服务。
2.6.2 IK分词器测试
1. IK分词器测试案例
1.将analyzer分词器设置为ik_max_word进⾏测试。
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "我是中国⼈"
}
2.运⾏得到以下结果。
{
"tokens": [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "是",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "中国⼈",
"start_offset": 2,
"end_offset": 5,
"type": "CN_WORD",
"position": 2
},
{
"token": "中国",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 3
},
{
"token": "国⼈",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 4
}
]
}
3.将analyzer分词器设置为ik_smart进⾏测试。
GET /_analyze
{
"analyzer": "ik_smart",
"text": "我是中国⼈"
}
4.运⾏得到以下结果。
{
"tokens": [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "是",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "中国⼈",
"start_offset": 2,
"end_offset": 5,
"type": "CN_WORD",
"position": 2
}
]
}
3 使⽤Kibana对索引库操作
3.1 索引基本操作
3.1.1 创建索引库
1.创建索引库语法
Elasticsearch采⽤RESTful⻛格API,因此其API就是⼀次HTTP请求,你可以⽤任何⼯具发起HTTP请求。
- 请求⽅式: PUT
- 请求路径: /索引库名
- 请求参数: JSON格式
{
"settings": {
"属性名": "属性值"
}
}
settings:就是索引库设置,其中可以定义索引库的各种属性,⽬前我们可以不设置,都⾛默认。
2.使⽤Kibana创建索引库
1.使⽤Kibana创建yx索引库。
PUT /库名
2.在Kibana的Console窗⼝点击绿⾊按钮发送请求,响应结果⻅下。
"acknowledged": true,
"shards_acknowledged": true,
"index": "库名"
}
3.1.2 查看索引库
GET请求可以帮我们查看索引信息,语法格式:
GET /索引库名
响应结果⻅下:
{
"库名": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"creation_date": "1670332544067",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "RQ2CUAEGR4uofhmgJIsNKg",
"version": {
"created": "6020499"
},
"provided_name": "库名"
}
}
}
}
3.1.3 删除索引库
删除索引使⽤DELETE请求。语法格式:
DELETE /索引库名
响应结果⻅下:
{
"acknowledged": true
}
4 使⽤kibana对类型及映射操作
4.1 创建字段映射
4.1.1 创建字段映射语法
语法格式:请求⽅式依然是PUT。
PUT /索引库名/_mapping/typeName
{
![img](https://img-blog.csdnimg.cn/img_convert/cbd6f6efb21456d44b158b0d15430719.png)
![img](https://img-blog.csdnimg.cn/img_convert/7540385ae5c8d92f70fd06e20bde9e18.png)
![img](https://img-blog.csdnimg.cn/img_convert/be88e6eb8e45cc8f650762942caac321.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
99"
},
"provided_name": "库名"
}
}
}
}
3.1.3 删除索引库
删除索引使⽤DELETE请求。语法格式:
DELETE /索引库名
响应结果⻅下:
{
"acknowledged": true
}
4 使⽤kibana对类型及映射操作
4.1 创建字段映射
4.1.1 创建字段映射语法
语法格式:请求⽅式依然是PUT。
PUT /索引库名/_mapping/typeName
{
[外链图片转存中...(img-HbgbsDdt-1714804451691)]
[外链图片转存中...(img-Tsm4Yiok-1714804451692)]
[外链图片转存中...(img-4QhLDgy8-1714804451692)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**