赞
踩
目录
2 ELK(Elasticsearch、Logstash、Kibana)使用
- <!-- 引入Lucene核心包及分词器包 -->
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-core</artifactId>
- <version>4.10.3</version>
- </dependency>
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-analyzers-common</artifactId>
- <version>4.10.3</version>
- </dependency>
- <!-- 单元测试 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <!-- 热部署 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- <scope>runtime</scope>
- <optional>true</optional>
- </dependency>
- <!-- Lombok工具 -->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
- <!-- IK中文分词器 -->
- <dependency>
- <groupId>com.janeluo</groupId>
- <artifactId>ikanalyzer</artifactId>
- <version>2012_u6</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- </dependency>
- 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
说明: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的数据,如果有唯⼀或者主键约束的话,下⼀次⽣成就会报错。
- 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 中添加
- <!-- IK中⽂分词器 -->
- <dependency>
- <groupId>com.janeluo</groupId>
- <artifactId>ikanalyzer</artifactId>
- <version>2012_u6</version>
- </dependency>
⽬前Elasticsearch最新的版本是8.x,企业内⽬前⽤的⽐较多是6.x,我们以6.2.4进⾏讲解,需要JDK 1.8及以上版 本。为了快速看到效果我们直接在本地操作系统上安装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的路径配置有区别,以上两种⽅式根据本地操作系统⼆选其⼀。
1.进⼊elasticsearch-6.2.4/bin/⽬录下通过启动⽂件来启动Elasticsearch。
- # Mac系统下启动Elasticsearch⽅式 - 在终端执⾏下⾯的⽂件
- ./elasticsearch
- # Windows系统下启动Elasticsearch⽅式 - 双击下⾯的⽂件运⾏
- elasticsearch.bat
2.启动成功后,终端将输出以下的信息。可以看到绑定了两个端⼝。
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"
- }
解决的⽅法是:修改虚拟机内存的⼤⼩。
1.找到elasticsearch-6.2.4/config/下的jvm.options配置⽂件,默认Xms和Xmx的初始值都为1G。
2.将Xms和Xmx的初始值进⾏修改,值都设置成256m。
- -Xms256m
- -Xmx256m
3.再重新通过启动⽂件来启动Elasticsearch进⾏测试。
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版本保持⼀致。
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地址进⾏测试。
1.在Kibana控制台左侧菜单列表中选择【DevTools】选项,即可进⼊控制台⻚⾯。
2.在⻚⾯右侧,我们就可以输⼊请求,然后点击运⾏按钮,就可以访问Elasticsearch了。
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地址将看到以下 窗⼝表示安装成功。
IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases。
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服务。
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 } ] }
Elasticsearch采⽤RESTful⻛格API,因此其API就是⼀次HTTP请求,你可以⽤任何⼯具发起HTTP请求。
- {
- "settings": {
- "属性名": "属性值"
- }
- }
settings:就是索引库设置,其中可以定义索引库的各种属性,⽬前我们可以不设置,都⾛默认。
1.使⽤Kibana创建yx索引库。
PUT /库名
2.在Kibana的Console窗⼝点击绿⾊按钮发送请求,响应结果⻅下。
-
- "acknowledged": true,
- "shards_acknowledged": true,
- "index": "库名"
- }
GET请求可以帮我们查看索引信息,语法格式:
GET /索引库名
响应结果⻅下:
{ "库名": { "aliases": {}, "mappings": {}, "settings": { "index": { "creation_date": "1670332544067", "number_of_shards": "5", "number_of_replicas": "1", "uuid": "RQ2CUAEGR4uofhmgJIsNKg", "version": { "created": "6020499" }, "provided_name": "库名" } } } }
删除索引使⽤DELETE请求。语法格式:
DELETE /索引库名
响应结果⻅下:
- {
- "acknowledged": true
- }
语法格式:请求⽅式依然是PUT。
- PUT /索引库名/_mapping/typeName
- {
- "properties": {
- "字段名": {
- "type": "类型",
- "index": true,
- "store": false,
- "analyzer": "分词器"
- }
- }
- }
如果yx索引库存在,响应结果⻅下:
- {
- "acknowledged": true
- }
注意:在进⾏创建索引库中的字段映射时,需要先确保索引库被创建,否则会抛 index_not_found_exception异常。
语法格式:
GET /索引库名/_mapping
如果要查看某个类型映射,可以在路径后⾯跟上类型名称。即:
GET /索引库名/_mapping/类型名
PUT /索引库名/类型名/id
GET /索引库名/_search
- put /索引库名
- {
- "settings": {
- "索引库属性名": "索引库属性值"
- },
- "mappings": {
- "类型名": {
- "properties": {
- "字段名": {
- "映射属性名": "映射属性值"
- }
- }
- }
- }
- }
语法格式:
- POST /索引库名/类型名
- {
- "key":"value"
- }
另外,需要注意的是,在响应结果中有⼀个 _id 字段,这个就是这条⽂档数据的唯⼀标识,以后的增删改查都依赖 这个 id 作为唯⼀标识。这⾥我们新增时没有指定id,所以是ES帮我们随机⽣成的id。
语法格式:
- POST /索引库名/类型/id值
- {
- ...
- }
根据Rest⻛格,新增是POST,查询是GET,不过查询⼀般都需要条件,这⾥我们把刚刚⽣成数据的id带上。
语法格式:
GET /库名索引/类型名称/id
_source:源⽂档信息,所有的数据都在⾥⾯。
_id:这条⽂档的唯⼀标识。
PUT表示修改⽂档。不过修改必须指定id。分为以下两种情况:
语法格式:
- PUT /库名索引/类型名称/id
- {
- ...
- }
响应结果:可以看到输出结果中的result属性的取值为created ,表示是新增数据操作。
语法格式:
DELETE /索引库名/类型名/id值
基本语法:
- GET /索引库名/_search
- {
- "query": {
- "查询类型": {
- "查询条件": "查询条件值"
- }
- }
- }
这⾥的query代表⼀个查询对象,⾥⾯可以有不同的查询属性。
链接: https://pan.baidu.com/s/1AXfx7x_8Vx5bYMPYQzCU0g?pwd=ti74
提取码: ti74
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。