使用SpringBoot+ElasticsearchTemplate的坑

想在项目中使用ES进行搜索引擎的使用,然后在网上找了很多Springboot整合ES的方法。可百度自行搜索,我选择的是使用spring-data-es

一 添加依赖

<dependency>
	<groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-elasticsearchartifactId>
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);
    }
}

结果是可以的:
使用SpringBoot+ElasticsearchTemplate的坑_第1张图片

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 对比两个有什么不一样

使用SpringBoot+ElasticsearchTemplate的坑_第2张图片
使用SpringBoot+ElasticsearchTemplate的坑_第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设置的
使用SpringBoot+ElasticsearchTemplate的坑_第4张图片
然后我记得有个@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);
    }
}

结果:
使用SpringBoot+ElasticsearchTemplate的坑_第5张图片
最后也可以使用我自己写的那个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已经被废弃掉了,以为就可以不用设这个东西了,原来还是不行啊。

你可能感兴趣的:(Elasticsearch,springBoot)