想在项目中使用ES进行搜索引擎的使用,然后在网上找了很多Springboot整合ES的方法。可百度自行搜索,我选择的是使用spring-data-es
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>
spring:
data:
elasticsearch:
cluster-name: my-application
#节点的地址,注意api模式下端口号是9300,千万不要写成9200
#是否开启本地存储
repositories:
enabled: false
cluster-nodes: 自己服务器的网址:9300
@Data
@Document(indexName = "buy")
public class Test {
@Id
private Integer id;
private String user_name;
private String user_password;
private String user_email;
}
@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));
}
}
于是我就开始运行了,结果发现出现了这个:
啊啊啊啊啊啊啊我要崩溃了
于是请教了学长【在长达时间摸索之下也不知道原因是什么】,下面就是我们的实验步骤
@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);
}
}
@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中导出来的,一个是自己手动插入进去的,那为什么会这样呢?
然后发现两个的
_type, _id 不一样,_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));
}
}
哪个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方法查到结果,所以这个假设也可以丢弃
那就把这个改为和从mysql中导入的_type一样叭
@Data
@Document(indexName = "buy", type = "_doc")
public class Test {
private String user_name;
private String user_password;
}
之后就可以成功了!!!!
之前在网上看到type已经被废弃掉了,以为就可以不用设这个东西了,原来还是不行啊。