前言:
elasticseach简称es,现在用得非常广泛,像百度等一些知名互联网公司都有用到es。那么es到底是什么呢?如何使用呢?下面就一起来学习一下。
一、es简介:
es是一个高度可扩展的开源全文搜索和分析引擎,可以快速的、近实时地对大数据进行存储、搜索和分析,用来支撑复杂的数据搜索需求和企业级应用。简单来说,它是一个搜索引擎,可以实现全文搜索,功能类似于lucene和solr。
二、es的安装:
下面介绍es的安装以及head插件的安装,都是在Windows上的安装。
1、es的安装:
(1)、下载:https://www.elastic.co/downloads/elasticsearch。
(2)、安装:安装很简单,只需解压即可。解压后进入bin目录,运行里面的elasticsearch.bat,即可运行es。、
(3)、注册为Windows服务:每次启动都要运行这个文件很麻烦,可以将es注册为windows的本地。
在cmd命令窗口进入es的bin目录,然后执行如下命令:
elasticsearch-service.bat install
执行成功后就可以看到es的服务了:
image.png
(4)、访问es:
启动redis服务后,访问localhost:9200
即可看到如下界面:
image.png
2、head插件的安装:
head插件可以很方便的操作es,head插件与es的关系就像navicat与MySQL数据库的关系,不过head插件的界面也是通过访问网址浏览的。 (1)、下载head插件:https://github.com/search?q=elasticsearch-head
image.png
下载好上图这个解压。 (2)、安装node.js:https://nodejs.org/en/download/ head插件需要node.js的支持,所以要安装它。
image.png
安装一路next即可。输入node -v
若出现node.js的版本信息,则安装成功。
(3)、安装grunt:
运行head需要借助grunt命令,所以要安装。
在cmd窗口进入node.js安装的根目录,然后执行npm install -g grunt -cli
。
(4)、安装pathomjs:
在cmd命令窗口进入head插件解压后的根目录,然后执行npm install
(5)、连接es: 在es的安装根目录的config目录下有elasticsearch.yml,在此文件中添加如下内容:
image.png
(6)、运行head:
在cmd命令窗口进入head插件解压后的根目录,然后执行grunt server
,如下图就启动成功。
image.png
然后访问localhost:9100
看到如下画面就安装成功。
image.png
三、springboot集成es:
点我下载源码。 1、添加依赖: build.gradle:
代码语言:javascript复制dependencies {
compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
//集成es还需要这个依赖,不然会报classNotfound的错误
compile('net.java.dev.jna:jna:4.3.0')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
以上是整个项目用到的依赖,也就是说,集成es只需要data-elasticsearch
和jna
依赖。
2、实体层: EsBlog.java:
代码语言:javascript复制import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "blog",type = "blog")//elasticsearch的注解
public class EsBlog implements Serializable {
private static final long serialVersionUID = 4564729518133694581L;
@Id
private String id;
private String title;
private String summary;
private String content;
}
3、repository: EsBlogRepository.java:
代码语言:javascript复制import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import com.zhu.estest.entity.EsBlog;
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String> {
/**
* 分页查询博客
* @param title
* @param summary
* @param content
* @param pageable
* @return
*/
Page<EsBlog> findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(String title,String summary,String content,Pageable pageable);
}
这里就定义了一个方法,方法名非常长,它也和jpa一样,按照规则定义方法就不用自己去实现。这个方法就是分页查找包含指定title或summary或content的内容。
4、junit测试: EsBlogRepositoryTest.java:
代码语言:javascript复制@RunWith(SpringRunner.class)
@SpringBootTest
public class EsBlogRepositoryTest {
@Autowired
private EsBlogRepository esBlogRepository;
@Before
public void initRepository() {
//清除所有数据
esBlogRepository.deleteAll();
//存入数据
esBlogRepository.save(new EsBlog("登鹳雀楼","王之涣的诗",
"白日依山尽,黄河入海流。欲穷千里目,更上一层楼。"));
esBlogRepository.save(new EsBlog("相思","王维的诗",
"红豆生南国,春来发几枝。愿君多采撷,此物最相思。"));
esBlogRepository.save(new EsBlog("静夜思","李白的诗",
"床前明月光,疑是地上霜。举头望明月,低头思故乡。"));
}
@Test
public void test() {
Pageable pageable = new PageRequest(0, 20);
String title = "思";
String summary = "相思";
String content = "相思";
Page<EsBlog> page = esBlogRepository.findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(
title, summary, content, pageable);
System.out.println(page.getTotalElements());
for(EsBlog blog : page.getContent()) {
System.out.println(blog);
}
}
}
这个测试类先往es中添加了三首唐诗作为数据,然后调用repository中的方法,查找title中含有“思”字或者summary中含有“相思”或者content中含有“相思”的内容。理论上应该返回除了登鹳雀楼以外的两条数据。
image.png
运行junit确实返回两条数据。
5、controller层: EsBlogController.java:
代码语言:javascript复制@RestController
@RequestMapping("/blogs")
public class EsBlogController {
@Autowired
private EsBlogRepository esBlogRepository;
@GetMapping
public List<EsBlog> list(@RequestParam("title") String title,
@RequestParam("summary") String summary,
@RequestParam("content") String content,
@RequestParam(value="pageIndex",defaultValue="0") int pageIndex,
@RequestParam(value="pageSize",defaultValue="10") int pageSize){
Pageable pageable = new PageRequest(pageIndex, pageSize);
//数据是在junit测试中初始化的
Page<EsBlog> page = esBlogRepository.findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(
title, summary, content, pageable);
return page.getContent();
}
}
在浏览器中访问:
image.png
测试通过。
总结:
本文提供的es以及head插件的安装是在Windows上的安装,Linux和mac可能会有不同。至于springboot集成es,主要就是添加两个依赖,然后repository继承ElasticsearchRepository即可。ElasticsearchRepository接口封装了一些操作es的方法,我们直接调用就行,或者根据命名规则定义的方法,也不用自己实现,就类似于springData Jpa。