一:什么是elasticsearch,elasticsearch在内存中怎样的结构
elasticsearch是一款基于全文搜索引擎 Apache Lucene进行封装的搜索引擎,它可以用于全文搜索,结构化搜索以及分析。
elasticsearch在内存中结构:
数据在内存中是这种的形式存在,索引相当于数据库,文档相当于表,文档id属性唯一。最后会指定域中某对json来进行关键字的生成,并将生成的词汇传给索引(index)组件。
二:怎么集成
一:添加依赖
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
ok!!第一个问题出现了,版本问题
pringboot 有一个 spring data 组件,可以用来连接各种数据源。 用来连接 elasticsearch 的是 spring-data-elasticsearch。
spring-data-elasticsearch 更新比较慢,其最高版本的 elasticsearch的6.x 版本。
so,我将版本统一为1.5.9,elasticsearch版本为2.4.2,ki版本为4.6.3
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
OK,又来个问题二,elasticsearch在java客户端的端口为9300,Restful Http的端口为9200,So配置文件application.yml中写入
spring:
data:
elasticsearch:
cluster-nodes: 127.0.0.1:9300
二:创建对象
@Document(indexName = "hello",type = "product")
public class product {
private int id;
private String name;
get.set。。。
}
indexName 为索引的名称,type为文档类型,两者用mysql来进行比喻,index相当于数据库名,type相当于表名
三:定义接口
定义一个proDao接口来实现ElasticsearchRepository<T, Serializable>
T为定义的类,Serializable为Integer
public interface proDao extends ElasticsearchRepository<product, Integer>{
}
这个就像是jpa一样,开箱即食,So,来个Controller搞定
四:书写Controller
@RestController
public class proController {
@Autowired
private proDao proDao;
@GetMapping("/add")
public void add() {
product p = new product(1, "墨镜");
proDao.save(p);
System.out.println("添加成功!!");
}
}
写一个添加产品,看一下效果。
五:kibana中看一下
一开始是没有索引的,需要我们自己创建一个。
步骤:Setting-》将iIndex contains time-based events的√取消-》输入你的索引名称-》create
最后点击Discover,你就可以看到了
完整的controller,controller里面有两个问题:一:没有query查询的方法,二:getAll()方法返回之后无法解析为json
同swagger测试,其他一些正常。
@RestController
public class proController {
@Autowired
private proDao proDao;
@GetMapping("/add")
public Object add(@RequestParam("id")int id,@RequestParam("name")String name) {
product p = new product(id,name);
proDao.save(p);
return p;
}
@GetMapping("/delete/{id}")
public Object del(@PathVariable("id")int id) {
product p = proDao.findOne(id);
proDao.delete(id);
return p;
}
@GetMapping("/update")
public Object update(@RequestParam("id")int id,@RequestParam("name")String name) {
product p = new product(id, name);
proDao.save(p);
return p;
}
@GetMapping("/getone/{id}")
public Object getone(@PathVariable("id")int id) {
product p = proDao.findOne(id);
return p ;
}
@GetMapping("/getAll")
public Object getAll() {
Iterable<product> all = proDao.findAll();
for (product product : all) {
System.out.println(product);
}
return all;
}
}
swagger界面
其实,最后应该有一个问题,为什么elasticsearch这个搜索引擎会这么快????
哈哈,我也在研究中!!!!