想在项目中使用ES进行搜索引擎的使用,然后在网上找了很多Springboot整合ES的方法。可百度自行搜索,我选择的是使用spring-data-es
一 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
二 配置Data ES
spring:
data:
elasticsearch:
cluster-name: my-application
#节点的地址,注意api模式下端口号是9300,千万不要写成9200
#是否开启本地存储
repositories:
enabled: false
cluster-nodes: 自己服务器的网址:9300
三 使用elasticsearchTemplate【坑点来了】
3.1 一个实体类
@Data
@Document(indexName = "buy")
public class Test {
@Id
private Integer id;
private String user_name;
private String user_password;
private String user_email;
}
3.2 定义一个控制类
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@PostMapping("/es")
public void test() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.build();
System.out.println(elasticsearchTemplate.queryForList(searchQuery, Test.class));
}
}
于是我就开始运行了,结果发现出现了这个:
啊啊啊啊啊啊啊我要崩溃了
于是请教了学长【在长达时间摸索之下也不知道原因是什么】,下面就是我们的实验步骤
3.2.1 如果不能进行查询步骤,那先进行插入看是否可以插入成功
@Data
@Document(indexName = "buy")
public class Test {
private String user_name;
private String user_password;
}
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@PostMapping("/es2")
public void test2() {
Test test = new Test();
test.setUser_name("nini");
test.setUser_password("1111111");
IndexQuery indexQuery = new IndexQueryBuilder().withObject(test).build();
elasticsearchTemplate.index(indexQuery);
}
}
结果是可以的:
3.2.2 然后说再用第一个代码查一下这个索引看能不能查出来
@Data
@Document(indexName = "buy")
public class Test {
private String user_name;
private String user_password;
}
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@PostMapping("/es")
public void test() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.build();
System.out.println(elasticsearchTemplate.queryForList(searchQuery, Test.class));
}
}
结果是可以查出来的
之后就很奇怪,一个是用logstash从mysql中导出来的,一个是自己手动插入进去的,那为什么会这样呢?
3.2.3 对比两个有什么不一样
然后发现两个的
_type, _id 不一样,_source不全一样
所以接下来就一个一个验证
3.2.4 猜想:是不是因为定义的实体类里面的变量不全包含_source里面的数据
@Data
@Document(indexName = "buy")
public class Test {
private String user_name;
}
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@PostMapping("/es")
public void test() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.build();
System.out.println(elasticsearchTemplate.queryForList(searchQuery, Test.class));
}
}
结果也是可以查出来的:
所以说不是因为这个原因
3.2.5 猜想:是不是因为_id不一样呢?
哪个hey索引的_id是这个的document_id设置的
然后我记得有个@Id注解好像可以设置这个东西,所以我就把我自己添加的那个_id变为和从mysql中导入的_id一样
@Data
@Document(indexName = "buy")
public class Test {
@Id
private Integer user_id;
private String user_name;
}
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@PostMapping("/es2")
public void test2() {
Test test = new Test();
test.setUser_name("nini");
test.setUser_id(1);
IndexQuery indexQuery = new IndexQueryBuilder().withObject(test).build();
elasticsearchTemplate.index(indexQuery);
}
}
结果:
最后也可以使用我自己写的那个test方法查到结果,所以这个假设也可以丢弃
3.2.6猜想:是不是因为_type不一样呢?
那就把这个改为和从mysql中导入的_type一样叭
@Data
@Document(indexName = "buy", type = "_doc")
public class Test {
private String user_name;
private String user_password;
}
之后就可以成功了!!!!
之前在网上看到type已经被废弃掉了,以为就可以不用设这个东西了,原来还是不行啊。