本篇文章是ElasticSearch的入门篇,全文提纲:
1.ElasticSearch产品介绍
2.ElasticSearch的同类产品
3.ElasticSearch的应用场景
4.ElasticSearch的安装使用
ElasticSearch介绍
一个高可扩展的开源全文搜索和分析引擎,它允许存储、搜索和分析大量的数据,并且这个过程是近实时的(近实时的概念:从建立索引到你能够搜索这个文档的过程,所用时间大概为1秒)
ElasticSearch的同类产品及优缺点
OpenSerach
阿里巴巴自主研发的大规模分布式搜索引擎平台。其主要为解决用户结构化数据搜索需求的托管服务,支持数据结构、搜索排序、数据处理自由定制Solr
Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制优缺点比较
ElasticSearch | OpenSearch | Solr | |
---|---|---|---|
优点 | 1.分布式且不需要其它组件 2.采用Gateway的概念,使得备份更加简单 3.各节点组成对等网络,某些节点出现故障时会自动分配其它节点代替进行工作 |
1.支持多种格式的索引 2.不建立索引的同时进行搜索,速度很快 |
|
缺点 | 使用时需要付费 | 1.建立索引时会产生IO阻塞,不是近实时的,实时索引效率不高 2.数据量增大,搜索效率下降会很明显 |
ElasticSearch的应用场景
- 全文检索
- 日志统计分析,实时动态分析海量日志数据
ElasticSearch的安装使用
- 如何安装
手把手教你安装es - 安装可能会遇到的问题
解决方法: 没有读取权限,给账户进行目录授权。Exception in thread "main" java.nio.file.AccessDeniedException: /usr/local/elasticsearch/config/jvm.options at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) at java.nio.file.Files.newByteChannel(Files.java:361) at java.nio.file.Files.newByteChannel(Files.java:407) at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384) at java.nio.file.Files.newInputStream(Files.java:152) at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:58)
需要授权的用户本身没有权限给自己授权,所以切换到root下sudo -i chown -R username /usr/local/elasticsearch
SpringBoot整合ElasticSearch
-
添加的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
-
配置文件
##端口号 server.port=8888 ##es地址 spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300
-
Dao层
继承ElasticsearchRepository<Article, String>类,第一个范型参数为实体类型,第二个范型参数为主键类型@Repository public interface ArticleDao extends ElasticsearchRepository<Article, String> { }
-
Service层
- 接口
public interface ArticleService { void saveArticle(); Article findById(); }
- 实现类
@Service public class ArticleServiceImpl implements ArticleService { @Autowired private ArticleDao articleDao; @Override public void saveArticle() { articleDao.save(Article.builder().id("1").title("title").content("This is content").build()); } @Override public Article findById() { return articleDao.findById("1").get(); } }
ElasticsearchRepository类里提供了很多简单的curd方法,如果查询不是特别复杂,可以直接使用
-
Controller层
@RestController public class ESController { @Autowired private ArticleService articleService; @PostMapping("/saveArticle") public String saveArticle() { articleService.saveArticle(); return "success"; } @GetMapping("/getArticle") public Article getArticle() { Article article = articleService.findById(); return article; } }
附:
完整项目地址