Elasticsearch安装、使用,Springboot整合Elasticsearch详细教程
沐雨橙风ιε 2024-09-05 16:37:01 阅读 87
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够实现近乎实时的搜索。
Elasticsearch官网
https://www.elastic.co/cn/
这篇文章主要简单介绍一下Elasticsearch,Elasticsearch的java API博主也在学习中~
目录
第一步:下载Elasticsearch
下载7.6.2版本
下载其他版本
第二步:安装Elasticsearch
第三步:安装kibana
第四步:导入Elasticsearch数据
第五步:Springboot整合Elasticsearch
1、创建springboot项目
2、修改pom.xml
3、创建es实体类
4、创建Elasticsearch的查询接口
第六步:学习DSL
1、无条件查询,默认返回10条数据
2、指定返回的数据条数
3、指定查询字段
4、分页查询
5、查询指定ID的数据
6、删除索引
7、条件查询
第七步:在java中使用Elasticsearch
1、通过ElasticsearchRepository
2、通过ElasticsearchRestTemplate
3、通过RestHighLevelClient
第一步:下载Elasticsearch
下载7.6.2版本
文章中使用的Elasticsearch版本是7.6.2,可以通过以下网盘链接下载,里面有7.6.2版本的ik分词器,链接永久有效。
elasticsearch7.6.2下载
https://pan.baidu.com/s/1h-7F3g9BuwtI_mgKs3ZMaQ?pwd=7ezi
下载完成后,把下面选中的Elasticsearch压缩文件解压到D盘
然后把ik分词器解压到Elasticsearch的plugins目录下,并把文件夹名称修改为ik。
下载其他版本
如需安装其他版本,可自行在官网下载。
1、访问官网,在首页点击页面上方的【文档】
2、点击All Elastic docs
3、点击选择other versions
4、在左侧版本列表选择对应的版本,点击对应链接,比如选择7.6.2版本
5、然后点击Installing the Elastic Stack
6、 在页面找到Elasticsearch,点击后面的install instructions(安装说明)
7、然后找到对应操作系统,比如windows,只需要点击Install Elasticsearch with .zip on Windows
8、在打开的页面向下滚动,找到Download and install the <code>.zip package
9、点击后面的zip压缩文件链接开始下载https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip
第二步:安装Elasticsearch
把下载下来的压缩包解压到系统盘,建议解压到D盘,如图
打开bin目录,双击下面的文件启动Elasticsearch
稍微等一下,启动完成后访问localhost:9200,如果返回了以下格式的数据,说明elasticsearch到此安装完成
第三步:安装kibana
为了方便使用elastic search的Query DSL(Domain Specified Language,领域专用语言),需要安装一下Elasticsearch的Kibana可视化控制台管理工具。
安装步骤和第二步类似,这里就不赘述了,安装完成后,还是解压到D盘
然后修改一下config目录下的kibaba.yml配置文件
使用文本编辑器打开yml文件,找到以下内容并取消注释,修改为对应的值
<code>server.port: 5601
server.host: "localhost"
server.name: "heyunlin" # 这个可以随意取名
elasticsearch.hosts: ["http://localhost:9200"] # elasticsearch服务器的地址
i18n.locale: "zh-CN" # 页面使用中文
最后打开bin目录,双击kibaba.bat启动kibaba
启动完成后,在浏览器地址栏输入http://localhost:5601/app/kibana#/dev_tools/console
然后就可以在左边写我们的DSL了,点击右边的运行按钮即可直接执行查询语句。
第四步:导入Elasticsearch数据
在Intellij IDEA中下载以下项目,在mysql数据库中新建数据库elastic,然后再数据库elastic下运行src/main/resources目录下的elastic.sql脚本文件。
Elasticsearch数据初始化项目
https://gitee.com/muyu-chengfeng/elastic-initdata.git
运行测试类,将数据从数据库elastic导入到Elasticsearch中
第五步:Springboot整合Elasticsearch
这一步是程序员最注重的,怎么在java中使用elasticsearch。
1、创建springboot项目
创建一个springboot项目springboot-elasticsearch
2、修改pom.xml
提供了完整的pom文件,可直接复制。
<code><?xml version="1.0" encoding="UTF-8"?>code>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"code>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">code>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath />
</parent>
<groupId>cn.edu.sgu.www</groupId>
<artifactId>springboot-elasticsearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-elasticsearch</name>
<description>Spring Boot整合Elastic search案例项目</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、创建es实体类
创建entity包,然后创建Song.java,@Document(indexName = "songs")注解指定索引名为songs,@Field注解配置字段的类型,只有text类型的字段会被分词。
package cn.edu.sgu.www.es.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;
import java.io.Serializable;
/**
* @author heyunlin
* @version 1.0
*/
@Data
@Document(indexName = "songs")
public class Song implements Serializable {
private static final long serialVersionUID = 42L;
@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 note;
/**
* 歌手
*/
@Field(type= FieldType.Text, analyzer = "ik_max_word")
private String singer;
}
4、创建Elasticsearch的查询接口
创建一个接口继承ElasticsearchRepository<E, T>接口,该接口的第一个参数类型为实体类型,二个参数类型是实体类的ID属性的数据类型,在这里是String。
package cn.edu.sgu.www.es.repository;
import cn.edu.sgu.www.es.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<Song, String> {
}
第六步:学习DSL
完成第五步之后,我们的es里已经有了803条歌曲的数据了,接下来学习DSL的使用,DSL就是Elasticsearch特有的查询语言。
DSL的格式:
其中index_name指的是Elasticsearch中的索引名,我们歌曲对应的索引名通过@Document注解指定为了songs
GET /index_name/_search {json请求体数据}
接下来介绍一下Elasticsearch中常用的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、指定返回的数据条数
通过size指定需要返回的结果数,以下查询语句将会返回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、删除索引
发送路径为/songs的delete请求即可删除songs这个索引。
DELETE /songs
7、条件查询
以下是查询歌曲名中包含“爱”字的歌曲,不指定返回的结果数则默认返回前10条。
GET /songs/_search
{
"query": {
"match": {
"name": "爱"
}
}
}
第七步:在java中使用Elasticsearch
这个章节会介绍三种通过java操作Elasticsearch的方式,提供了简单的使用案例代码。
1、通过ElasticsearchRepository
ElasticsearchRepository有一套标准的方法命名规范,符合规范的方法名在输入的时候就会有提示,比如findByXxx(Object xxx),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<Song, String> {
List<Song> 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;
import java.util.Optional;
/**
* @author heyunlin
* @version 1.0
*/
@SpringBootTest
public class ElasticsearchRepositoryTests {
@Autowired
private SongRepository songRepository;
@Test
void testFindByName() {
List<Song> list = songRepository.findByName("雨爱");
System.out.println("共查询到" + list.size() + "条记录。");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
for (Song song : list) {
System.out.println(song);
}
}
@Test
void testSave() {
Song song = new Song();
song.setId("2023");
song.setName("雨爱");
song.setNote("雨爱");
Song save = songRepository.save(song);
System.out.println("save = " + save);
}
@Test
void testDelete() {
Song song = new Song();
song.setId("2023");
song.setName("雨爱");
song.setNote("雨爱");
songRepository.delete(song);
}
@Test
void testDeleteById() {
songRepository.deleteById("2023");
testFindByName();
}
@Test
void testDeleteAll() {
songRepository.deleteAll();
}
@Test
void testExistsById() {
songRepository.existsById("2023");
}
@Test
void testFindById() {
testSave();
Optional<Song> optional = songRepository.findById("2023");
if (optional.isPresent()) {
Song song = optional.get();
System.out.println(song);
}
}
@Test
void testCount() {
long count = songRepository.count();
System.out.println(count);
}
}
如图,查询出来73首符合条件的歌曲。
2、通过ElasticsearchRestTemplate
下面通过简单的案例来介绍ElasticsearchRestTemplate的使用,相关的API博主也在学习中。
<code>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<Song> search = elasticsearchRestTemplate.search(Query.findAll(), Song.class);
List<SearchHit<Song>> searchHits = search.getSearchHits();
for (SearchHit<Song> searchHit : searchHits) {
System.out.println(searchHit);
}
}
@Test
void testIndexOps() {
IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Song.class);
System.out.println(indexOperations.exists());
}
}
3、通过RestHighLevelClient
例如,下面代码删除了songs索引中ID为2023的文档。
package com.example.elastic;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
/**
* @author heyunlin
* @version 1.0
*/
@SpringBootTest
public class RestHighLevelClientTests {
@Autowired
RestHighLevelClient restHighLevelClient;
@Test
void test() throws IOException {
DeleteRequest songs = Requests.deleteRequest("songs");
songs.id("2023");
DeleteResponse deleteResponse = restHighLevelClient.delete(songs, RequestOptions.DEFAULT);
int status = deleteResponse.status().getStatus();
System.out.println(status);
}
}
DeleteRequest表示一次删除请求,必须通过id()方法设置文档ID,否则会抛出异常,执行delete()方法会得到一个删除操作的响应对象,可以通过getStatus()得到响应状态码,就和我们的http请求响应状态码一样。
因为type这个概念在Elasticsearch7.x版本已经被弃用了,所以type()这个方法也被声明了已废弃。
那么DeleteRequest又要通过什么方式得到呢?
点开DeleteRequest的源码,在类的注释上已经告诉我们最好的创建方式是通过Requests.deleteRequest()方法。
然后我们点开这个方法,这个方法的参数是String类型,变量名为index,很显然这就是我们需要操作的索引的名字。这个方法的注释上说了必须设置id和type,因为type的概念已经被删除,则需要设置id,这个id顾名思义就是文档ID。
<code>/**
* Creates a delete request against a specific index. Note the {@link DeleteRequest#type(String)} and
* {@link DeleteRequest#id(String)} must be set.
*
* @param index The index name to delete from
* @return The delete request
* @see org.elasticsearch.client.Client#delete(org.elasticsearch.action.delete.DeleteRequest)
*/
public static DeleteRequest deleteRequest(String index) {
return new DeleteRequest(index);
}
好了,文章就分享到这里了,看完不要忘了点赞+收藏哦~
文章的项目已上传到Gitee,可按需获取:
Springboot整合Elasticsearch案例项目
https://gitee.com/muyu-chengfeng/springboot-elasticsearch.git
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。