場景
SpringBoot中整合ElasticSearch快速入門以及踩坑記錄:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135599698
在上面進行集成的基礎(chǔ)上,實現(xiàn)對ES數(shù)據(jù)的增刪改查等操作。
注:
博客:
霸道流氓氣質(zhì)-CSDN博客
實現(xiàn)
1、ElastciSearch的對象映射
Spring Data Elasticsearch - Reference Documentation
Spring Data Elasticsearch 對象映射是將 Java 對象(域?qū)嶓w)映射到存儲在 Elasticsearch 中的 JSON 表示并返回的過程。
可用注解參考官網(wǎng)明細(xì):
@Document:在類級別應(yīng)用,以指示此類是映射到數(shù)據(jù)庫的候選項。 最重要的屬性是:
indexName:要存儲此實體的索引的名稱。 這可以包含一個 SpEL 模板表達式,例如"log-#{T(java.time.LocalDate).now().toString()}"
type:映射類型。 如果未設(shè)置,則使用類的小寫簡單名稱。(自 4.0 版起已棄用)
shards:索引的分片數(shù)。
replicas:索引的副本數(shù)。
refreshIntervall:索引的刷新間隔。 用于創(chuàng)建索引。 默認(rèn)值為“1s”。
indexStoreType:索引的索引存儲類型。 用于創(chuàng)建索引。 默認(rèn)值為“fs”。
createIndex:標(biāo)記是否在存儲庫引導(dǎo)時創(chuàng)建索引。 默認(rèn)值為 true。 請參閱使用相應(yīng)映射自動創(chuàng)建索引
versionType:版本管理的配置。 默認(rèn)值為 EXTERNAL。
@Id:在字段級別應(yīng)用以標(biāo)記用于標(biāo)識目的的字段。
@Transient:默認(rèn)情況下,所有字段在存儲或檢索文檔時都映射到文檔,此注釋不包括該字段。
@PersistenceConstructor:標(biāo)記給定的構(gòu)造函數(shù)(甚至是受包保護的構(gòu)造函數(shù))以在從數(shù)據(jù)庫實例化對象時使用。 構(gòu)造函數(shù)參數(shù)按名稱映射到檢索到的 Document 中的鍵值。
@Field:應(yīng)用于字段級別并定義字段的屬性,大部分屬性映射到相應(yīng)的 Elasticsearch Mapping 定義(以下列表不完整,請查看注解 Javadoc 以獲取完整參考):
name:將在 Elasticsearch 文檔中表示的字段名稱,如果未設(shè)置,則使用 Java 字段名稱。
type:字段類型,可以是 Text、Keyword、Long、Integer、Short、Byte、Double、Float、Half_Float、Scaled_Float、Date、Date_Nanos、Boolean、Binary、Integer_Range、Float_Range、Long_Range、Double_Range、Date_Range、Ip_Range、Object、Nested、Ip、TokenCount、Percolator、Flattened、Search_As_You_Type之一。 請參閱 Elasticsearch 映射類型
format以及 Date 類型的定義。pattern
store:標(biāo)記是否應(yīng)將原始字段值存儲在 Elasticsearch 中,默認(rèn)值為 false。
analyzer、 ,用于指定自定義分析器和規(guī)范化程序。searchAnalyzernormalizer
@GeoPoint:將字段標(biāo)記為geo_point數(shù)據(jù)類型。 如果字段是類的實例,則可以省略。GeoPoint
當(dāng)然也可以自定義轉(zhuǎn)換規(guī)則:
按照以上注解說明,新建實體類
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
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;
@Document(indexName="books",createIndex = true)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ElasticBook {
??? @Id
??? private Integer id;
??? @Field(type = FieldType.Text)
??? private String name;
??? @Field(type = FieldType.Text)
??? private String summary;
??? @Field(type = FieldType.Integer)
??? private Integer price;
}
這里createIndex 默認(rèn)就是true,可以不寫,代表如果索引不存在則創(chuàng)建。
2、增刪改查實現(xiàn)
新建接口Repository,使其繼承ElasticsearchRepository
import com.ruoyi.system.domain.study.ElasticBook;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ElasticSearchRepository extends ElasticsearchRepository<ElasticBook,Integer> {
??? List<ElasticBook> findByName(String name);
}
則可以直接使用其自帶的各種方法
也可以自定義方法,比如findByName就是根據(jù)書名模糊搜索
自定義派生的方法不用實現(xiàn),只要符合其關(guān)鍵字和規(guī)則可自動實現(xiàn)。
這塊可參考官網(wǎng)從方法名稱創(chuàng)建查詢說明:
Spring Data Elasticsearch - Reference Documentation
3、新建Service接口
import java.util.List;
public interface IElasticSearchService {
??? void save(ElasticBook book);
??? ElasticBook findById(Integer id);
??? void update(ElasticBook book);
??? void deleteById(Integer id);
??? List<ElasticBook> findByName(String name);
}
4、新建service實現(xiàn)
import com.ruoyi.system.repository.ElasticSearchRepository;
import com.ruoyi.system.service.IElasticSearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ElasticSearchServiceImpl implements IElasticSearchService {
??? @Autowired
??? private ElasticSearchRepository repository;
??? @Override
??? public void save(ElasticBook book) {
??????? repository.save(book);
??? }
??? @Override
??? public ElasticBook findById(Integer id) {
??????? return repository.findById(id).get();
??? }
??? @Override
??? public void update(ElasticBook book) {
??????? repository.save(book);
??? }
??? @Override
??? public void deleteById(Integer id) {
??????? repository.deleteById(id);
??? }
??? @Override
??? public List<ElasticBook> findByName(String name) {
??????? return repository.findByName(name);
??? }
}
5、編寫單元測試
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RuoYiApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ElasticSearchTest {
??? @Autowired
??? @Qualifier("elasticsearchClient")
??? public RestHighLevelClient highLevelClient;
??? @Autowired
??? private IElasticSearchService iElasticSearchService;
??? @Test
??? public void connecTest() throws IOException {
??????? CreateIndexRequest request = new CreateIndexRequest("test");
??????? CreateIndexResponse response = highLevelClient.indices().create(request, RequestOptions.DEFAULT);
??????? // 查看是否創(chuàng)建成功
??????? System.out.println(response.isAcknowledged());
??????? highLevelClient.close();
??? }
??? //保存
??? @Test
??? public void saveTest() throws IOException {
??????? ElasticBook book = ElasticBook.builder().id(1).name("書名1").summary("霸道的程序猿").price(100).build();
??????? iElasticSearchService.save(book);
??????? highLevelClient.close();
??????? System.out.println("保存成功");
??? }
??? //根據(jù)主鍵查詢
??? @Test
??? public void findTest() throws IOException {
??????? ElasticBook book = ElasticBook.builder().id(2).name("書名2").summary("霸道的程序猿").price(80).build();
??????? iElasticSearchService.save(book);
??????? ElasticBook book1 = iElasticSearchService.findById(2);
??????? highLevelClient.close();
??????? System.out.println("查詢成功");
??????? System.out.println(book1);
??? }
??? //根據(jù)主鍵更新
??? @Test
??? public void updateTest() throws IOException {
??????? ElasticBook book = ElasticBook.builder().id(2).name("書名2更新").summary("霸道的程序猿").price(80).build();
??????? iElasticSearchService.update(book);
??????? ElasticBook book1 = iElasticSearchService.findById(2);
??????? highLevelClient.close();
??????? System.out.println("更新成功");
??????? System.out.println(book1);
??? }
??? //根據(jù)主鍵刪除
??? @Test
??? public void deleteTest() throws IOException {
??????? iElasticSearchService.deleteById(1);
??????? highLevelClient.close();
??????? System.out.println("刪除成功");
??? }
??? //派生查詢
??? @Test
??? public void findByNameTest() throws IOException {
??????? List<ElasticBook> bookList = iElasticSearchService.findByName("書名");
??????? highLevelClient.close();
??????? System.out.println("查詢成功");
??????? System.out.println(bookList);
??? }
}
6、單元測試運行結(jié)果
保存結(jié)果
根據(jù)主鍵查詢結(jié)果
更新結(jié)果
模糊搜索
7、關(guān)于查詢與擴展
通過上面簡單入門后,關(guān)于查詢還有計數(shù)、排序、分頁、條件等高級用法,這里可以在需要用到時再查詢官方文檔查看文章來源:http://www.zghlxwxcb.cn/news/detail-802807.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-802807.html
到了這里,關(guān)于SpringBoot中整合ElasticSearch實現(xiàn)增刪改查等操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!