ElasticSearch的安装以及与springboot的集成
前言:
elasticseach简称es,现在用得非常广泛,像百度等一些知名互联网公司都有用到es。那么es到底是什么呢?如何使用呢?下面就一起来学习一下。
一、es简介
es是一个高度可扩展的开源全文搜索和分析引擎,可以快速的、近实时地对大数据进行存储、搜索和分析,用来支撑复杂的数据搜索需求和企业级应用。简单来说,它是一个搜索引擎,可以实现全文搜索,功能类似于lucene和solr。
二、es的安装:
官方网站自行下载:https://www.elastic.co/downloads/elasticsearch
安装很简单,只需解压即可。解压后进入bin目录,运行里面的elasticsearch.bat,即可运行es。
elasticsearch弹簧数据弹性搜索对Springboot与Elasticsearch有要求,可参考https://github.com/spring-projects/spring-data-elasticsearch,我的Springboot是2.1.2,下载的Elasticsearch-6.2.2,你可以根据自己的情况下载。
另外,我在Elasticsearch-6.2.2运行elasticsearch.bat时候出现一个问题\ Java \ jdk1.8.0_151 \ bin \ java.exe“-cp”C:……………
解决:如果你的java安装在C:\ Program Files(x86)下,那么在下面设置JAVA_HOME
设置JAVA_HOME = C:\ Progra~2 \ Java \ jre1.8.0_131
如果你的java安装在C:\ Program Files下,那么设置JAVA_HOME就像下面
设置JAVA_HOME = C:\ Progra~1 \ Java \ jre1.8.0_131
解决问题的链接:https://discuss.elastic.co/t/unable-to-start-elasticsearch-6-2-0-in-windows-10/118851/5
三、springboot集成es:
项目依赖:
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--data-elasticsearch-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
以上是整个项目用到的依赖,也就是说,集成es只需要data-elasticsearch和jna依赖。
实体Blog
/**
* Create bySeptember
* 2019/2/11
* 16:34
*/
@Document(indexName = "blog",type = "blog") //文档
public class Blog implements Serializable {
private static final long serialVersionUID = 299997038365626833L;
@Id
private String id; // 主键
private String title;
private String summary;
private String content;
protected Blog() { //JPA规范要求
}
public Blog(String title, String summary, String content) {
this.title = title;
this.summary = summary;
this.content = content;
}
//省略get/set
@Override
public String toString() {
return "Blog{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", summary='" + summary + '\'' +
", content='" + content + '\'' +
'}';
}
}
仓库repository
/**
* Create bySeptember
* 2019/2/11
* 16:35
*/
//Blog 存储库
public interface BlogRepository extends ElasticsearchRepository<Blog,String> {
Page<Blog> findDistinctBlogByTitleContainingOrSummaryContainingOrContentContaining(String title, String summary,String content, Pageable pageable);
}
这里就定义了一个方法,方法名很长,它和jpa一样,按照规则定义方法就不用自己去实现。这个方法就是分页查找包含指定title或summary或content的内容。
junit测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class BlogRepositoryTest {
@Autowired
private BlogRepository blogRepository;
@Before
public void initRepository(){
//清除所有数据
blogRepository.deleteAll();
//存入数据
blogRepository.save(new Blog("登鹳雀楼","王之涣的诗",
"白日依山尽,黄河入海流。欲穷千里目,更上一层楼。"));
blogRepository.save(new Blog("相思","王维的诗",
"红豆生南国,春来发几枝。愿君多采撷,此物最相思。"));
blogRepository.save(new Blog("静夜思","李白的诗",
"床前明月光,疑是地上霜。举头望明月,低头思故乡。"));
}
@Test
public void testfindDistinctBlogByTitleContainingOrSummaryContainingOrContentContaining(){
Pageable pageable = new PageRequest(0, 20);
String title = "思";
String summary = "相思";
String content = "相思";
Page<Blog> page = blogRepository.findDistinctBlogByTitleContainingOrSummaryContainingOrContentContaining(title, summary,content, pageable);
assertThat(page.getTotalElements()).isEqualTo(2);
for (Blog blog: page.getContent()){
System.out.println(blog.toString());
}
}
}
这个测试类先往es中添加了三首唐诗作为数据,然后调用repository中的方法,查找title中含有“思”字或者summary中含有“相思”或者content中含有“相思”的内容。理论上应该返回除了登鹳雀楼以外的两条数据。测试结果passed
Blog{id='zHtj4GgBRi0EnhF9tlGJ', title='静夜思', summary='李白的诗', content='床前明月光,疑是地上霜。举头望明月,低头思故乡。'}
Blog{id='y3tj4GgBRi0EnhF9tlEE', title='相思', summary='王维的诗', content='红豆生南国,春来发几枝。愿君多采撷,此物最相思。'}
总结:
本文提供的es的安装是在Windows上安装,Linux和mac可能会有不同。至于springboot集成es,主要就是添加两个依赖,然后repository继承ElasticsearchRepository即可。ElasticsearchRepository接口封装了一些操作es的方法,我们直接调用就行,或者根据命名规则定义的方法,也不用自己实现,就类似于springData Jpa。