Springboot集成Elasticsearch的步驟與相關(guān)功能
集成配置步驟
步驟1:加入 Maven 相關(guān)依賴
<!-- 指定 Springboot 版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.7</version>
<relativePath/>
</parent>
<!-- 相關(guān)jar包 -->
<dependencies>
<!-- SpringBoot核心jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web開發(fā)包:包含Tomcat和Springmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- ES 核心包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- lombok 實(shí)體簡化插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
步驟2:配置 elasticsearch 的主機(jī)和端口
elasticsearch: host: 127.0.0.1 port: 9200

步驟3:配置 Elaseticsearch 客戶端
@Data
@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
private String host;
private Integer port;
@Override
public RestHighLevelClient elasticsearchClient() {
return new RestHighLevelClient(RestClient.builder(new HttpHost(host, port)));
}
}

步驟4:創(chuàng)建文檔實(shí)體
@Data
@Document(indexName = "users")
public class User {
@Id
@Field(type = FieldType.Long)
private Long id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Keyword)
private String sex;
@Field(type = FieldType.Integer)
private Integer age;
@Field(type = FieldType.Text)
private String address;
}

步驟5:創(chuàng)建 controller,service, dao 層
(5.1)contrller 層
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
}
(5.2)service 層
public interface UserService {
}
(5.3)service 實(shí)現(xiàn)層(UserDao 見 5.4)
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
}
(5.4)dao 層
@Repository
public interface UserDao extends ElasticsearchRepository<User, Long> {
}
整個(gè)相關(guān)類創(chuàng)建完成后,項(xiàng)目結(jié)構(gòu)應(yīng)該如下圖所示:

相關(guān)功能實(shí)現(xiàn)
這里以實(shí)際功能舉例,并列出 controller 和 service 層的實(shí)現(xiàn)類寫法作為參考。
主流的一些功能,ES 已經(jīng)給你封裝,默認(rèn)給與了支持(如:示例1-6),這些相關(guān)的實(shí)現(xiàn)不需要我們再寫 dao 層,但一些較為業(yè)務(wù)性的查詢,還需要自己手動來寫。
1. 添加文檔
controller 層:
@PostMapping("/save")
public String save(@RequestBody User user) {
long id = System.currentTimeMillis();
user.setId(id);
userService.save(user);
return "新增成功,id為:" + id;
}
service 層:
@Override
public Long save(User user) {
userDao.save(user);
return user.getId();
}
測試效果:

?2. 修改文檔
【注】新增文檔和修改文檔操作,dao 層都是調(diào)用的 save() 方法,當(dāng) id 不存在的時(shí)候,ES(ElasticSearch)就會執(zhí)行新增操作,當(dāng) id 對象已經(jīng)存在的時(shí)候,就會執(zhí)行修改操作。
controller 層:
@PostMapping("/update")
public String update(@RequestBody User user) {
userService.save(user);
return "修改成功";
}
service 層:
@Override
public Long save(User user) {
userDao.save(user);
return user.getId();
}
測試效果:

?3. 根據(jù)ID查詢文檔
controller 層:
@GetMapping("/{id}")
public User getById(@PathVariable("id") Long id) {
return userService.getById(id);
}
service 層:
@Override
public User getById(Long id) {
Optional<User> find = userDao.findById(id);
if (find.isPresent()) {
return find.get();
}
return null;
}
測試效果:

?4. 根據(jù)ID刪除文檔
controller 層:
@DeleteMapping("/{id}")
public String deleteById(@PathVariable("id") Long id) {
userService.deleteById(id);
return "刪除成功";
}
service 層:
@Override
public void deleteById(Long id) {
userDao.deleteById(id);
}
測試效果:

?5. 查詢所有文檔
controller 層:
@GetMapping("/all")
public List<User> all() {
return userService.getAll();
}
service 層:
@Override
public List<User> getAll() {
Iterable<User> users = userDao.findAll();
if (users == null) {
return Collections.emptyList();
}
List<User> userList = new ArrayList<User>();
users.forEach(o -> userList.add(o));
return userList;
}
測試效果:

?6. 條件查詢(單個(gè)條件)
如:查詢name包含"瑪麗"的數(shù)據(jù)
controller 層:
@GetMapping("/listByName")
public List<User> listByName(String name) {
return userService.getListByName(name);
}
service 層:
@Override
public List<User> getListByName(String name) {
return userDao.findByName(name);
}
dao 層:測試效果:

?7. 條件查詢(多條件)
如:查詢 name包含"瑪麗",年齡為25的數(shù)據(jù)。
controller 層:
@GetMapping("/listByNameAndAge")
public List<User> listByNameAndAge(String name, Integer age) {
return userService.getListByNameAndAge(name, age);
}
service 層:
@Override
public List<User> getListByNameAndAge(String name, Integer age) {
return userDao.findByNameAndAge(name, age);
}
dao 層:
List<User> findByNameAndAge(String name, Integer age);

?8. 分頁查詢(降序)
controller 層:
@GetMapping("/listOrderByAgeDesc")
public List<User> listOrderByAgeDesc() {
return userService.getListOrderByAgeDesc();
}
service 層:
@Override
public List<User> getListOrderByAgeDesc() {
return userDao.findByOrderByAgeDesc();
}
dao 層:
List<User> findByOrderByAgeDesc();
測試效果:

?9. 分頁查詢(升序)
?controller 層:
@GetMapping("/listOrderByAgeAsc")
public List<User> listOrderByAgeAsc() {
return userService.getListOrderByAgeAsc();
}
service 層:
@Override
public List<User> getListOrderByAgeAsc() {
return userDao.findByOrderByAgeAsc();
}
dao 層:
List<User> findByOrderByAgeAsc();
測試效果:

?10. 分頁查詢
controller 層:
@GetMapping("/page")
public Page<User> page(Integer pageNum, Integer pageSize) {
return userService.getPage(pageNum, pageSize);
}
service 層:
@Override
public Page<User> getPage(int pageNum, int pageSize) {
// 注意,這里的pageNum是從0開始的,如果要查詢第1頁數(shù)據(jù),pageNum應(yīng)該為0
Pageable pageable = PageRequest.of(pageNum, pageSize);
return userDao.findAll(pageable);
}
測試效果:

?11. 范圍查詢( > )
controller 層:
@GetMapping("/listGreaterThanAge")
public List<User> listGreaterThanAge(Integer age) {
return userService.getListGreaterThanAge(age);
}
service 層:
@Override
public List<User> getListGreaterThanAge(Integer age) {
return userDao.findByAgeGreaterThan(age);
}
dao 層:
List<User> findByAgeGreaterThan(Integer age);
測試效果:

12. 范圍查詢( >= )?
controller 層:
@GetMapping("/listGreaterThanEqualAge")
public List<User> listGreaterThanEqualAge(Integer age) {
return userService.getListGreaterThanEqualAge(age);
}
service 層:
@Override
public List<User> getListGreaterThanEqualAge(Integer age) {
return userDao.findByAgeGreaterThanEqual(age);
}
dao 層:
List<User> findByAgeGreaterThanEqual(Integer age);
測試效果:

?13. 范圍查詢( < )
controller 層:
@GetMapping("/listLessThanAge")
public List<User> listLessThanAge(Integer age) {
return userService.getListLessThanAge(age);
}
service 層:
@Override
public List<User> getListLessThanAge(Integer age) {
return userDao.findByAgeLessThan(age);
}
dao 層:
List<User> findByAgeLessThan(Integer age);
測試效果:

?14. 范圍查詢( <= )
controller 層:
@GetMapping("/listLessThanEqualAge")
public List<User> listLessThanEqualAge(Integer age) {
return userService.getListLessThanEqualAge(age);
}
service 層:
@Override
public List<User> getListLessThanEqualAge(Integer age) {
return userDao.findByAgeLessThanEqual(age);
}
dao 層:
List<User> findByAgeLessThanEqual(Integer age);
測試效果:

附:ElasticSearch中對索引的一些常用操作
1. 獲取Elasticsearch中所有的index:
curl -XGET 'localhost:9200/_cat/indices?v&pretty'
2. 獲取某索引下所有的type:
獲取elasticsearch索引下所有的type定義
curl -XGET 'localhost:9200/elasticsearch/_mapping'
3. 刪除索引:
刪除elasticsearch1索引
curl -XDELETE 'localhost:9200/elasticsearch1?pretty'
4. 刪除某索引下的某type數(shù)據(jù):
刪除索引elasticsearch下的article類型
curl -XDELETE 'http://localhost:9200/elasticsearch/article/'
5. 查看某索引的某type下所有的數(shù)據(jù):
查找elasticsearch索引中所有的類型為Company的數(shù)據(jù)
http://localhost:9200/elasticsearch/Company/_search
總結(jié)
到此這篇關(guān)于Springboot集成Elasticsearch的文章就介紹到這了,更多相關(guān)Springboot集成Elasticsearch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud Gateway動態(tài)轉(zhuǎn)發(fā)后端服務(wù)實(shí)現(xiàn)過程講解
這篇文章主要介紹了SpringCloud Gateway動態(tài)轉(zhuǎn)發(fā)后端服務(wù)實(shí)現(xiàn)過程,簡單的路由轉(zhuǎn)發(fā)可以通過SpringCloudGateway的配置文件實(shí)現(xiàn),在一些業(yè)務(wù)場景種,會需要?jiǎng)討B(tài)替換路由配置中的后端服務(wù)地址,單純靠配置文件無法滿足這種需求2023-03-03
MyBatis中執(zhí)行相關(guān)SQL語句的方法
本文主要介紹了MyBatis中執(zhí)行相關(guān)SQL語句的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
自定義一個(gè)簡單的JDBC連接池實(shí)現(xiàn)方法
下面小編就為大家分享一篇自定義一個(gè)簡單的JDBC連接池實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
基于ZooKeeper實(shí)現(xiàn)隊(duì)列源碼
這篇文章主要介紹了基于ZooKeeper實(shí)現(xiàn)隊(duì)列源碼的相關(guān)內(nèi)容,包括其實(shí)現(xiàn)原理和應(yīng)用場景,以及對隊(duì)列的簡單介紹,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
java 中用split分割字符串,最后的空格等不被拆分的方法
下面小編就為大家?guī)硪黄猨ava 中用split分割字符串,最后的空格等不被拆分的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
SpringSecurity學(xué)習(xí)之自定義過濾器的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringSecurity學(xué)習(xí)之自定義過濾器的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01

