一、几个概念
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
github.com
](link.zhihu.com/?target=htt…)
以下是官网的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 支持通配符 类似 han 会自动变为 han* * Like类似StartingWith */ @Test void findByFirstnameLike() { List<Person> result = personRepository.findByFirstnameLike("han"); assertNotNull(result); result.forEach(res-> System.out.println("查询结果:"+res)); } /** * 通过Firstname模糊查询 * 以Like Contains Containing结尾即模糊查询 * Contains 支持通配符 类似 han 会自动变为 *ank* * */ @Test void findByFirstnameContains() { List<Person> result = personRepository.findByFirstnameContains("ank"); 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
](link.zhihu.com/?target=htt…)
最新Java Elasticsearch 7.10教程(汇总)
[玄明Hanko:最新Java Elasticsearch 7.10教程(汇总)
zhuanlan.zhihu.com](zhuanlan.zhihu.com/p/321248369)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END