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教程(匯總)

玄明Hanko:最新Java Elasticsearch 7.10教程(匯總)​zhuanlan.zhihu.com圖標

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM