SpringBoot集成ElasticSearch的示例代碼
一、Elasticseach介紹
1.簡(jiǎn)單介紹
官網(wǎng):開源搜索:Elasticsearch、ELK Stack 和 Kibana 的開發(fā)者 | Elastic
https://www.elastic.co/cn/
ElasticSeach詳細(xì)安裝教程--圖文介紹超詳細(xì)
令人記憶深刻的口號(hào):能夠發(fā)現(xiàn)意料之中以及意料之外的情況
Elasticsearch也是基于Lucene的全文檢索庫(kù),本質(zhì)也是存儲(chǔ)數(shù)據(jù),很多概念與MySQL類似的。是一種全文檢索技術(shù)。
Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和豐富您的數(shù)據(jù)并將其存儲(chǔ)在 Elasticsearch 中。Kibana 使您能夠以交互方式探索、可視化和分享對(duì)數(shù)據(jù)的見解,并管理和監(jiān)控堆棧。Elasticsearch 是索引、搜索和分析魔法發(fā)生的地方。
Elasticsearch 是一個(gè)基于JSON的分布式搜索和分析引擎。
Elasticsearch是用Java語(yǔ)言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級(jí)搜索引擎。Elasticsearch用于云計(jì)算中,能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定,可靠,快速,安裝使用方便。
2.對(duì)比關(guān)系:
索引(indices)--------------------------------Databases 數(shù)據(jù)庫(kù)
類型(type)-----------------------------Table 數(shù)據(jù)表
文檔(Document)----------------Row 行
字段(Field)-------------------Columns 列
3.詳細(xì)說(shuō)明:
概念 | 說(shuō)明 |
索引庫(kù)(indices) | indices是index的復(fù)數(shù),代表許多的索引, |
類型(type) | 類型是模擬mysql中的table概念,一個(gè)索引庫(kù)下可以有不同類型的索引,比如商品索引,訂單索引,其數(shù)據(jù)格式不同。不過(guò)這會(huì)導(dǎo)致索引庫(kù)混亂,因此未來(lái)版本中會(huì)移除這個(gè)概念 |
文檔(document) | 存入索引庫(kù)原始的數(shù)據(jù)。比如每一條商品信息,就是一個(gè)文檔 |
字段(field) | 文檔中的屬性 |
映射配置(mappings) | 字段的數(shù)據(jù)類型、屬性、是否索引、是否存儲(chǔ)等特性 |
4.查出數(shù)據(jù)的解釋
took:查詢花費(fèi)時(shí)間,單位是毫秒
time_out:是否超時(shí)
_shards:分片信息
hits:搜索結(jié)果總覽對(duì)象
total:搜索到的總條數(shù)
max_score:所有結(jié)果中文檔得分的最高分
hits:搜索結(jié)果的文檔對(duì)象數(shù)組,每個(gè)元素是一條搜索到的文檔信息
_index:索引庫(kù)
_type:文檔類型
_id:文檔id
_score:文檔得分
_source:文檔的源數(shù)據(jù)
二、SpringBoot集成Elasticseach
1.引入依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>2.添加配置
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.7.132:93003.創(chuàng)建pojo類與索引對(duì)應(yīng)
package com.leyou.elasticsearch.pojo;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* 創(chuàng)建pojo類與索引對(duì)應(yīng)
*
* @author Promsing(張有博)
* @version 1.0.0
* @since 2022/1/26 - 20:35
*/
@Document(indexName = "item", type = "docs", shards = 1, replicas = 0)
public class Item {
@Id
private Long id;
/**
* 標(biāo)題
*/
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String title;
* 分類
@Field(type = FieldType.Keyword)
private String category;
* 品牌
private String brand;
* 價(jià)格
@Field(type = FieldType.Double)
private Double price;
* 圖片地址
private String images;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
public String getTitle() {
return title;
public void setTitle(String title) {
this.title = title;
public String getCategory() {
return category;
public void setCategory(String category) {
this.category = category;
public String getBrand() {
return brand;
public void setBrand(String brand) {
this.brand = brand;
public Double getPrice() {
return price;
public void setPrice(Double price) {
this.price = price;
public String getImages() {
return images;
public void setImages(String images) {
this.images = images;
public Item() {
public Item(Long id, String title, String category, String brand, Double price, String images) {
@Override
public String toString() {
return "Item{" +
"id=" + id +
", title='" + title + '\'' +
", category='" + category + '\'' +
", brand='" + brand + '\'' +
", price=" + price +
", images='" + images + '\'' +
'}';
}4.SpringData封裝了基礎(chǔ)的增刪改查,自定義增刪改查
這里需要繼承接口-ItemRepository
/**
* 自定義的增刪改查接口
*
* @author Promsing(張有博)
* @version 1.0.0
* @since 2022/1/27 - 15:10
*/
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
List<Item> findByTitle(String title);
List<Item> findByPriceBetween(Double d1,Double d2);
}5.測(cè)試方法--增刪改查
package com.leyou.elasticsearch;
import com.leyou.elasticsearch.dao.ItemRepository;
import com.leyou.elasticsearch.pojo.Item;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* 測(cè)試ES的增刪改查
*
* @author Promsing(張有博)
* @version 1.0.0
* @since 2022/1/26 - 20:57
*/
@SpringBootTest(classes = ElasticsearchApplication.class)
@RunWith(SpringRunner.class)
public class ElasticsearchTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;//ES的模板類
private ItemRepository itemRepository;//Item的增刪改查
/**
* 創(chuàng)建索引庫(kù)
*/
@Test
public void testIndex(){
this.elasticsearchTemplate.createIndex(Item.class);
this.elasticsearchTemplate.putMapping(Item.class);
//this.elasticsearchTemplate.deleteIndex();
}
* 插入與更新
public void testCreate(){
Item item = new Item(1L,"小米手機(jī)9","手機(jī)","小米",3999.00,"https:www.baidu.com");
Object save = this.itemRepository.save(item);
List<Item> list = new ArrayList<>();
list.add(new Item(2L, "堅(jiān)果手機(jī)R1", " 手機(jī)", "錘子", 3699.00, "http://image.leyou.com/123.jpg"));
list.add(new Item(3L, "華為META10", " 手機(jī)", "華為", 4499.00, "http://image.leyou.com/3.jpg"));
// 接收對(duì)象集合,實(shí)現(xiàn)批量新增
Iterable<Item> items = itemRepository.saveAll(list);
System.out.println(items);
* 刪除
public void testDelete(){
Item item=new Item(1L,"小米手機(jī)9","手機(jī)","小米",3999.00,"https:www.baidu.com");
this.itemRepository.delete(item);
* 查詢
public void testFind(){
System.out.println("-----主鍵查詢------");
Optional<Item> byId = this.itemRepository.findById(1L);
System.out.println(byId.get());
System.out.println("-----查詢?nèi)?-----");
Iterable<Item> all = this.itemRepository.findAll();
all.forEach(i-> System.out.println(i));
System.out.println("-----排序查詢(升序降序)------");
Iterable<Item> price = this.itemRepository.findAll(Sort.by("price").descending());
price.forEach(System.out::println);
* 調(diào)用自定義方法
public void testFindByU(){
List<Item> phone = this.itemRepository.findByTitle("手機(jī)");
// phone.forEach(i->{
// System.out.println(i);
// });
List<Item> byPriceBetween = this.itemRepository.findByPriceBetween(4000.0, 5000.0);
byPriceBetween.forEach(i-> System.out.println(i));
* 批量插入
public void indexList() {
list.add(new Item(1L, "小米手機(jī)7", "手機(jī)", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(2L, "堅(jiān)果手機(jī)R1", "手機(jī)", "錘子", 3699.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(3L, "華為META10", "手機(jī)", "華為", 4499.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(4L, "小米Mix2S", "手機(jī)", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(5L, "榮耀V10", "手機(jī)", "華為", 2799.00, "http://image.leyou.com/13123.jpg"));
itemRepository.saveAll(list);
* 高級(jí)查詢
public void testSearch(){
//通過(guò)查詢構(gòu)建器工具構(gòu)建--重點(diǎn):QueryBuilders:詞條、模糊、范圍
MatchQueryBuilder queryBuilder= QueryBuilders.matchQuery("title","手機(jī)");
//獲取結(jié)果集
Iterable<Item> items = this.itemRepository.search(queryBuilder);
items.forEach(System.out::println);
* 重點(diǎn)--自定義查詢
public void testNative(){
// 構(gòu)建自定義查詢構(gòu)建器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本查詢條件
queryBuilder.withQuery(QueryBuilders.matchQuery("title","手機(jī)"));
// 查詢分頁(yè)結(jié)果集
Page<Item> itemPage = this.itemRepository.search(queryBuilder.build());
System.out.println(itemPage.getTotalPages());
System.out.println(itemPage.getTotalElements());
itemPage.forEach(i-> System.out.println(i));
* 重點(diǎn)--分頁(yè)查詢
public void testPage(){
queryBuilder.withQuery(QueryBuilders.matchQuery("category","手機(jī)"));
queryBuilder.withPageable(PageRequest.of(1,2));
* 重點(diǎn)--排序
public void testSort(){
queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
}到此這篇關(guān)于SpringBoot集成Elasticseach的文章就介紹到這了,更多相關(guān)SpringBoot集成Elasticseach內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 實(shí)現(xiàn)圖片上傳并回顯功能
本篇文章給大家分享Spring Boot 實(shí)現(xiàn)圖片上傳并回顯功能,文中通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07
關(guān)于PreparedStatement的setObject作用及說(shuō)明
這篇文章主要介紹了關(guān)于PreparedStatement的setObject作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
springcloud gateway自定義斷言規(guī)則詳解,以后綴結(jié)尾進(jìn)行路由
這篇文章主要介紹了springcloud gateway自定義斷言規(guī)則詳解,以后綴結(jié)尾進(jìn)行路由,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java數(shù)據(jù)結(jié)構(gòu)篇之實(shí)現(xiàn)二叉搜索樹的核心方法
二叉搜索樹是一種常用的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹,且每個(gè)節(jié)點(diǎn)的值都大于其左子樹中任何節(jié)點(diǎn)的值,而小于其右子樹中任何節(jié)點(diǎn)的值,這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)篇之實(shí)現(xiàn)二叉搜索樹的核心方法,需要的朋友可以參考下2023-12-12
Java經(jīng)典設(shè)計(jì)模式之適配器模式原理與用法詳解
這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之適配器模式,簡(jiǎn)單說(shuō)明了適配器模式的概念、原理,并結(jié)合實(shí)例形式分析了java適配器模式的用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08
Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解
這篇文章主要介紹了Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
解決定時(shí)任務(wù)@Scheduled沒(méi)有準(zhǔn)時(shí)執(zhí)行的原因及分析
這篇文章主要介紹了解決定時(shí)任務(wù)@Scheduled沒(méi)有準(zhǔn)時(shí)執(zhí)行的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

