Elasticsearch7.x教程(三)-SpringBoot+DataRepositories

一、几个概念

1、Index Type Document

一般我们初学时会把这些与数据库进行对照方便理解

  • Index->Database
  • Type->Table (最新版本已经不使用Type了,所以很多人会奇怪为什么去掉了?ES并非和数据库是相同的,所以不要完全按数据库的方式来看ES)
  • Document->Row

2、倒排索引

参考此文:(一般我们从目录找到相应的文章为正向索引,如果从关键词索引找到对应的文章即倒排索引)

ES 索引解析(倒排索引 | 正排索引)

 

二、几种Java调用ES方式

  • Rest API Test
  • Using SpringBoot+Spring Data Repositories
  • Using the SpringBoot+RestClient
  • Using Transport Client

推荐使用SpringBoot+Spring Data Repositories,封装的比较完善,上手简单,如果使用一些高级搜索的话可以考虑使用 SpringBoot+RestClient(RestHighLevelClient )

三、SpringBoot+Spring Data Repositories

  • 官网的github仓库及对应的demo

https://github.com/spring-projects/spring-data-elasticsearch​github.com

 

 

以下是官网的demo,可以看到上手比较简单

public interface PersonRepository extends CrudRepository<Person, Long> {
/*
 *springdatarepository可以直接通过方法名的语义来实现功能,
 *比如查询可以这样写findBy+需要查询字段名+操作
 *当然你在IDE里会自动提示
*/
  List<Person> findByLastname(String lastname);

  List<Person> findByFirstnameLike(String firstname);
}

@Service
public class MyService {

  private final PersonRepository repository;

  public MyService(PersonRepository repository) {
    this.repository = repository;
  }

  public void doWork() {
    //创建&更新
    Person person = new Person();
    person.setFirstname("Oliver");
    person.setLastname("Gierke");
    repository.save(person);
    //删除
    repository.deleteAll();
    //精确查询
    List<Person> lastNameResults = repository.findByLastname("Gierke");
    //模糊查询
    List<Person> firstNameResults = repository.findByFirstnameLike("Oli");
 }
}

 

  • 以下是相应的方法名语义对照表

 

  • 相应的一些test case
@SpringBootTest
class PersonRepositoryTest {
    @Autowired
    PersonRepository personRepository;

    @BeforeEach
    void setUp() {
    }

    /**
     * 创建或更新index document
     * 删除类似,方法名为personRepository.delete
     */
    @Test
    void create_update() {
        Person person = Person.builder()
                .id("101")
                .firstname("hanko java")
                .lastname("zhou")
                .build();
        Person result = personRepository.save(person);
        assertNotNull(result);
        assertEquals(person.getId(),result.getId());
    }

    /**
     * 通过Lastname精确查询
     */
    @Test
    void findByLastname() {
        List<Person> result = personRepository.findByLastname("zhou");
        assertNotNull(result);
        result.forEach(res-> System.out.println("查询结果:"+res));
    }

    /**
     * 通过Firstname模糊查询
     * 以Like Contains Containing结尾为模糊查询
     * Like Contains区别在于Like可以支持通配符
     */
    @Test
    void findByFirstnameLike() {
        List<Person> result = personRepository.findByFirstnameContains("hanko*");
        assertNotNull(result);
        result.forEach(res-> System.out.println("查询结果:"+res));
    }
    

 

 

四、相关笔记

Springboot DataRepositories也可以支持复杂的查询,这时需要引入@Query注解

    @Query("{\n" +
            "    \"match\": {\n" +
            "      \"firstname\": {\n" +
            "        \"query\": \"?0\"\n" +
            "      }\n" +
            "    }\n" +
            "  }")
    List<Person> queryByScript(String firstname);

 

  • 相应源代码

hanko/springboot-elasticsearch​gitee.com

 

 

 

最新Java Elasticsearch 7.10教程(汇总)

https://blog.csdn.net/citywu123/article/details/110240244

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈江湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值