安装ES
1,首先安装ES,这里使用docker,拉取镜像,这里选择版本为6.7.1
docker pull elasticsearch:6.7.1
如果下载速度过慢,可配置一下阿里云的镜像加速,本人亲测,配置前后下载速度,是公交车和地铁的区别
2.下载完成后是这样的
3.接下来我们要启动它,ES默认启动需要2G的内存,这边需要设置参数限制一下:docker run -d -e ES_JAVA_POTS="-Xms128m -Xmx128m" --name es0 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" e2667f5db289 说明:9200默认为ES的数据交互端口,9300为管理端口,discovery.type=single-node表示为单节点启动,这里我们不做集群,最后面为刚才下载的镜像ID,-Xms128m -Xmx128m表示指定最大内存为128M,我的阿里云配置简陋,本次是做测试,给小一点,能出效果就行,各位根据自身机器配置定义即可
4.正常启动,是这个样子的:
5。正常启动后,我们在浏览器上访问一下:101.101.45.102:9200,成功返回数据:
出现如上数据,则说明elasticsearch部署初步成功,接下来我们进行springboot整合elasticsearch,实现简单的数据索引。
**
spring boot整合Elasticsearch
**
1.新建一个springboot项目,我选择的版本是2.1.13.RELEASE,初步选择web依赖,创建项目即可.
2.springboot可以使用两种方式与elasticsearch 进行交互,一种是使用SpringData Elasticsearch,另一种是使用Jest,其中Jest是默认不生效的,需要配置,依赖如下:
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>6.3.1</version>
</dependency>
3.我们先来测试Jest,引入依赖后,新建一个entity,
package com.weige.entity;
import io.searchbox.annotations.JestId;
public class Student {
//表明这是一个ES需要用到的id
@JestId
private int id;
private String sname;
private String interest;
public Student(int id, String sname, String interest) {
this.id = id;
this.sname = sname;
this.interest = interest;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getInterest() {
return interest;
}
public void setInterest(String interest) {
this.interest = interest;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", sname='" + sname + '\'' +
", interest='" + interest + '\'' +
'}';
}
}
4.创建一个测试类,测试试索引(添加)该对象,代码如下:
package com.weige;
import com.weige.entity.Student;
import io.searchbox.client.JestClient;
import io.searchbox.core.Index;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
@RunWith(SpringRunner.class)
@SpringBootTest
public class JestTest {
//引入jest模板
@Autowired
JestClient jestClient;
@Test
public void JestPutIndex() {
//创建一个对象
Student student=new Student(1,"李明","李明喜欢踢足球");
//创建索引并把数据索引到elasticsearch指定的位置
Index index=new Index.Builder(student).index("weige").type("students").build();
//执行索引操作
try {
jestClient.execute(index);
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行该方法后,控制台出现一抹翠绿,证明索引成功,我们在浏览器进行验证
出现这个,说明数据索引成功,接下来我们通过Java方法查询一下,再编写一个测试类:
@Test
public void JestGetIndex() {
String json="{\n" +
"\t\"query\": {\n" +
"\t\t\"match\": {\n" +
"\t\t\t\t\t\"sname\": \"李明\"\n" +
"\t\t\t\t}\n" +
"\t\t}\n" +
"}";
Search search=new Search.Builder(json).addIndex("weige").addType("students").build();
try {
SearchResult searchResult=jestClient.execute(search);
System.out.println("搜寻结果为---->"+searchResult);
JSONObject jsStr = JSONObject.parseObject(searchResult.getJsonString()); //将字符串{“id”:1}
Object obret=jsStr.get("hits");
JSONObject jsStr1 = JSONObject.parseObject(obret.toString());
Object lm=jsStr1.get("hits");
System.out.println("结果为---->"+lm);
} catch (IOException e) {
e.printStackTrace();
}
}
这里的查询json串是这个值:{
“query”: {
“match”: {
“sname”: “明”
}
}
}
查询出来的数据,包裹的挺严实,我们需要做适当的解析
具体更多的的查询语法规则,可以参考Elasticsearch,数据能存能取,测试初步成功。
接下来我们测试一下使用SpringData Elasticsearch
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.新建一个entity
package com.weige.entity;
import org.springframework.data.elasticsearch.annotations.Document;
import java.math.BigDecimal;
//这里指定了索引名称和type名称
@Document(indexName = "weigee",type = "computer")
public class Computer {
private Integer id;
private String cname;
private BigDecimal price;
public Computer() {
}
public Computer(Integer id, String cname, BigDecimal price) {
this.id = id;
this.cname = cname;
this.price = price;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@Override
public String toString() {
return "Computer{" +
"id=" + id +
", cname='" + cname + '\'' +
", price=" + price +
'}';
}
}
3.新建一个mapper,继承ElasticsearchRepository<Computer ,Integer>,并自定义一个根据名称查询所有的方法;
package com.weige.mapper;
import com.weige.entity.Computer;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface ComputerMapper extends ElasticsearchRepository<Computer,Integer> {
public List<Computer> findComputerByCname(String cname);
}
4.测试索引数据
@Test
public void testSpingDataPut(){
//Computer computer=new Computer(1,"苹果",new BigDecimal("15500.00"));
// Computer computer=new Computer(2,"三星",new BigDecimal("9500.00"));
Computer computer=new Computer(3,"中星",new BigDecimal("7500.00"));
computerMapper.index(computer);
}
5.查询数据
@Test
public void testSpingDataGet(){
List<Computer> computers=computerMapper.findComputerByCname("星");//搜索名称中包含‘星’的对象打印出来
for (Computer c:computers) {
System.out.println(c.getCname());
}
}
控制台输出
如此这般,springboot整合elasticsearch,实现简单的数据存取功能就实现了,更多功能特性尚在研究中,不足之处,欢迎大家指正