1. 關(guān)于 Elasticsearch
Elasticsearch 是一個(gè)分布式的 RESTful 搜索和分析引擎遍膜,可用來集中存儲(chǔ)您的數(shù)據(jù)郎仆,以便您對(duì)形形色色、規(guī)模不一的數(shù)據(jù)進(jìn)行搜索捺癞、索引和分析憾赁。
我們可以在這里下載Elasticsearch的安裝文件,建議下載二進(jìn)制壓縮文件赠橙。對(duì)于本文的讀者耽装,您只需解壓下載的文件,然后執(zhí)行下面的命令即可啟動(dòng)Elasticsearch期揪。
cd ./elasticsearch-7.8.0/bin
./elasticsearch
2. Spring Data
?Spring Data 是 Spring 的一個(gè)子項(xiàng)目掉奄。用于簡化數(shù)據(jù)訪問,支持NoSQL 和 關(guān)系數(shù)據(jù)庫凤薛,map-reduce框架和基于云的數(shù)據(jù)服務(wù)姓建。其主要目標(biāo)是使數(shù)據(jù)的訪問變得方便快捷。從官網(wǎng)中可以看到目前Spring Data支持的數(shù)據(jù)種類非常多缤苫。Elasticsearch是其中的一種速兔。
2.1 Maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.2 配置文件
編輯application.properties文件,增加如下內(nèi)容:
spring.data.elasticsearch.client.reactive.endpoints=127.0.0.1:9200
spring.data.elasticsearch.repositories.enabled=true
2.3 定義實(shí)體類
//注意indexName要小寫
@Document(indexName = "blog")
@Setter
@Getter
@ToString
public class Article {
@Id
private String id;
private String title;
@Field(type = FieldType.Nested, includeInParent = true)
private List<Author> authors;
public Article(String title) {
this.title = title;
}
}
public class Author {
private String name;
public Author(String name) {
this.name = name;
}
}
2.4 定義Repository接口
@Repository
public interface ArticleRepository extends ElasticsearchRepository<Article,String> {
//下面的這兩個(gè)查詢的作用是一樣的活玲。一個(gè)采用默認(rèn)的實(shí)現(xiàn)方式涣狗,一個(gè)采用自定義的實(shí)現(xiàn)方式
Page<Article> findByAuthorsName(String name, Pageable pageable);
@Query("{\"bool\": {\"must\": [{\"match\": {\"authors.name\": \"?0\"}}]}}")
Page<Article> findByAuthorsNameUsingCustomQuery(String name, Pageable pageable);
//搜索title字段
Page<Article> findByTitleIsContaining(String word,Pageable pageable);
Page<Article> findByTitle(String title,Pageable pageable);
}
3 使用
3.1 在測試類中自動(dòng)裝載repository和template實(shí)例
@Autowired
private ArticleRepository articleRepository;
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
3.2 檢查index是否存在
//檢查相應(yīng)的索引是否存在谍婉,如果spring.data.elasticsearch.repositories.enabled=True,則會(huì)自動(dòng)創(chuàng)建索引
private boolean checkIndexExists(Class<?> cls){
boolean isExist = elasticsearchRestTemplate.indexOps(cls).exists();
//獲取索引名
String indexName = cls.getAnnotation(Document.class).indexName();
System.out.printf("index %s is %s\n", indexName, isExist ? "exist" : "not exist");
return isExist;
}
@Test
void checkIndex() {
checkIndexExists(Article.class);
}
3.2 新增數(shù)據(jù)
@Test
void save(){
Article article = new Article("Spring Data Elasticsearch");
article.setAuthors(asList(new Author("LaoAlex"),new Author("John")));
articleRepository.save(article);
article = new Article("Spring Data Elasticsearch2");
article.setAuthors(asList(new Author("LaoAlex"),new Author("King")));
articleRepository.save(article);
article = new Article("Spring Data Elasticsearch3");
article.setAuthors(asList(new Author("LaoAlex"),new Author("Bill")));
articleRepository.save(article);
}
3.3 查詢
@Test
void queryAuthorName() throws JsonProcessingException {
Page<Article> articles = articleRepository.findByAuthorsName("LaoAlex", PageRequest.of(0,10));
//將對(duì)象轉(zhuǎn)為Json字符串
ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = objectWriter.writeValueAsString(articles);
System.out.println(json);
}
//使用自定義查詢
@Test
void queryAuthorNameByCustom() throws JsonProcessingException {
Page<Article> articles = articleRepository.findByAuthorsNameUsingCustomQuery("John",PageRequest.of(0,10));
//將對(duì)象轉(zhuǎn)為Json字符串
ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = objectWriter.writeValueAsString(articles);
System.out.println(json);
}
3.4 使用template進(jìn)行查詢
//使用Template進(jìn)行關(guān)鍵字查詢
//關(guān)于正則表達(dá)式可以參考https://www.runoob.com/java/java-regular-expressions.html
//.*data.* 可以匹配ddata, dataa等
@Test
void queryTileContainByTemplate() throws JsonProcessingException {
Query query = new NativeSearchQueryBuilder().withFilter(regexpQuery("title",".*elasticsearch2.*")).build();
SearchHits<Article> articles = elasticsearchRestTemplate.search(query, Article.class, IndexCoordinates.of("blog"));
//將對(duì)象轉(zhuǎn)為Json字符串
ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = objectWriter.writeValueAsString(articles);
System.out.println(json);
}
3.5 更新
@Test
void update() throws JsonProcessingException {
Page<Article> articles = articleRepository.findByTitle("Spring Data Elasticsearch",PageRequest.of(0,10));
//將對(duì)象轉(zhuǎn)為Json字符串
ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = objectWriter.writeValueAsString(articles);
System.out.println(json);
Article article = articles.getContent().get(0);
System.out.println(article);
article.setAuthors(null);
articleRepository.save(article);
}
3.6 刪除
@Test
void delete(){
Page<Article> articles = articleRepository.findByTitle("Spring Data Elasticsearch",PageRequest.of(0,10));
Article article = articles.getContent().get(0);
articleRepository.delete(article);
}
4 總結(jié)
本文使用Spring Data對(duì)Elasticsearch進(jìn)行了增、刪镀钓、改穗熬、查操作。原代碼以及放在GitHub上(https://github.com/superhq/LaoAlexJava.git)丁溅。