一、幾個概念
1、Index Type Document
一般我們初學時會把這些與數據庫進行對照方便理解
- Index->Database
- Type->Table (最新版本已經不使用Type了,所以很多人會奇怪為什么去掉了?ES並非和數據庫是相同的,所以不要完全按數據庫的方式來看ES)
- Document->Row
2、倒排索引
參考此文:(一般我們從目錄找到相應的文章為正向索引,如果從關鍵詞索引找到對應的文章即倒排索引)
二、幾種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
以下是官網的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);
- 相應源代碼

最新Java Elasticsearch 7.10教程(匯總)
玄明Hanko:最新Java Elasticsearch 7.10教程(匯總)