Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够实现近乎实时的搜索。
Elasticsearch官网https://www.elastic.co/cn/
目录
第一步:下载Elasticsearch
下载7.6.2版本
下载其他版本
第二步:安装Elasticsearch
第三步:安装kibana
第四步:Springboot整合Elasticsearch
1、创建springboot项目
2、在pom.xml中添加依赖
3、修改配置文件
4、创建数据库和es的实体类
5 、创建mapper接口及映射文件
6、创建elasticsearch的查询接口
7、开启mapper包扫描
第五步:从mysql导入数据到es
第六步:学习DSL
1、无条件查询,默认返回10条数据
2、指定返回的数据条数
3、指定查询字段
4、分页查询
5、查询指定ID的数据
6、删除索引
7、条件查询
第七步:在java中使用elasticsearch
1、通过ElasticsearchRepository
2、通过ElasticsearchRestTemplate
这篇文章主要简单介绍一下Elasticsearch,Elasticsearch的java API博主也在学习中,文章会持续更新~
第一步:下载Elasticsearch
下载7.6.2版本
这篇文章使用的Elasticsearch版本是7.6.2,可以通过以下网盘链接下载,里面有7.6.2版本的ik分词器,链接永久有效。
elasticsearch7.6.2下载https://pan.baidu.com/s/1D_HS8w_WW3dfQllGzNGv8A?pwd=p3aa
下载其他版本
如需安装其他版本,可在官网自行安装。
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 .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
问了方便使用elasticsearch的Query DSL(Domain Specified Language,领域专用语言),需要安装一下Elasticsearch的Kibana可视化控制台管理工具。
安装步骤和第二步类似,这里就不赘述了,安装完成后,还是解压到D盘
然后修改一下config目录下的kibaba.yml配置文件
使用文本编辑器打开yml文件,找到以下内容并取消注释,修改为对应的值
server.port: 5601server.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了,点击右边的运行按钮即可直接执行查询语句。
第四步:Springboot整合Elasticsearch
这一步是java程序员最注重的,怎么在java中使用elasticsearch。
1、创建springboot项目
首先,创建一个springboot项目elastic
2、在pom.xml中添加依赖
完成的pom文件如下,可以直接复制。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><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>com.example</groupId><artifactId>elastic</artifactId><version>0.0.1-SNAPSHOT</version><properties><java.version>1.8</java.version><druid.version>1.1.21</druid.version><mysql.version>8.0.28</mysql.version><lombok.version>1.18.22</lombok.version><mybatis.version>2.2.2</mybatis.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>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</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、修改配置文件
修改elastic.yml,复制以下内容
spring:# 数据库配置datasource:username: rootpassword: rooturl: jdbc:mysql://localhost:3306/elastictype: com.alibaba.druid.pool.DruidDataSourceserver:port: 9021mybatis:mapper-locations: classpath:mapper/*Mapper.xml
4、创建数据库和es的实体类
创建entity包,然后创建Song.java,@Document(indexName = "songs")注解指定索引名为songs,@Field注解配置字段的类型,只有text类型的字段会被分词。
package com.example.elastic.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;/*** 歌曲* @author heyunlin* @version 1.0*/
@Data
@Document(indexName = "songs")
public class Song {@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 singer;/*** 描述信息*/@Field(type= FieldType.Text, analyzer = "ik_max_word")private String note;/*** 歌曲文件*/private String url;/*** 歌曲文件是否存在/是否已上传*/@Field(type= FieldType.Long)private Integer uploaded;// /**
// * 最后一次修改时间
// */
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
// private LocalDateTime lastUpdateTime;
}
5 、创建mapper接口及映射文件
创建mapper包,创建一个接口SongMapper.java
package com.example.elastic.mapper;import com.example.elastic.entity.Song;
import org.springframework.stereotype.Repository;import java.util.List;/*** @author heyunlin* @version 1.0*/
@Repository
public interface SongMapper {List<Song> selectAll();
}
在resources目录下创建mapper包,然后创建SongMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.elastic.mapper.SongMapper"><resultMap id="resultMap" type="com.example.elastic.entity.Song"><result property="id" column="id" /><result property="name" column="name" /><result property="note" column="note" /><result property="singer" column="singer" /><result property="url" column="url" /><result property="uploaded" column="uploaded" />
<!-- <result property="lastUpdateTime" column="last_update_time" />--></resultMap><select id="selectAll" resultMap="resultMap">select * from song</select>
</mapper>
6、创建elasticsearch的查询接口
创建一个接口继承ElasticsearchRepository<E, T>接口,该接口的第一个参数类型为实体类型,二个参数类型是实体类的ID属性的数据类型,在这里是String。
package com.example.elastic.repository;import com.example.elastic.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> {}
7、开启mapper包扫描
package com.example.elastic.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;/*** Mybatis配置类* @author heyunlin* @version 1.0*/
@Configuration
@MapperScan(basePackages = "com.example.elastic.mapper")
public class MybatisConfig {}
第五步:从mysql导入数据到es
通过上一步骤,已经成功完成es的整合,接下来查询mysql数据库,把mysql的数据保存到es中。
接下来,需要创建数据库elastic,然后运行sql脚本,SQL脚本文件在文章末尾的项目链接对应项目上,在这里就不贴出来了,太长了。
修改测试类,运行initData()方法
package com.example.elastic;import com.example.elastic.entity.Song;
import com.example.elastic.mapper.SongMapper;
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;@SpringBootTest
class ElasticApplicationTests {@Autowiredprivate SongMapper songMapper;@Autowiredprivate SongRepository repository;@Testvoid initData() {List<Song> list = songMapper.selectAll();for (Song song : list) {repository.save(song);}}}
第六步:学习DSL
完成第五步之后,我们的es里已经有了803条歌曲的数据了,接下来学习DSL的使用,DSL就是一种查询语言。
DSL的格式,其中songs是指es中的索引名,我们歌曲对饮的索引名通过注解指定了songs
GET /songs/_search {json请求体数据}
接下来介绍一下es中常用的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、指定返回的数据条数
以下查询语句将会返回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、删除索引
DELETE /songs
7、条件查询
以下是查询歌曲名中包含“爱”字的歌曲
GET /songs/_search
{"query": {"match": {"name": "爱"}}
}
第七步:在java中使用elasticsearch
上面已经介绍了以下es的简单使用,接下来通过java来操作es。
1、通过ElasticsearchRepository
ElasticsearchRepository有一套标准的方法命名规范,比如findByXxx(),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;/*** @author heyunlin* @version 1.0*/
@SpringBootTest
public class ElasticsearchRepositoryTests {@Autowiredprivate SongRepository songRepository;@Testvoid test() {List<Song> list = songRepository.findByName("爱");System.out.println("共查询到" + list.size() + "条记录。");System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");for (Song song : list) {System.out.println(song);}}}
如图,查询出来73首符合条件的歌曲。
2、通过ElasticsearchRestTemplate
下面通过简单的案例来介绍ElasticsearchRestTemplate的使用,相关的API博主也在学习中。
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 {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Testvoid 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);}}@Testvoid testIndexOps() {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Song.class);System.out.println(indexOperations.exists());}}
好了,文章就分享到这里了,项目已开源,按需获取~
Springboot整合Elasticsearchhttps://gitee.com/he-yunlin/elastic.git