Version correspondence
The elasticsearch version integrated this time is 7.6.2, and the corresponding springboot version number is 2.3.3
pom file
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sunyuqi</groupId>
<artifactId>springboot-elasticsearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-elasticsearch</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>9</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
spring:
elasticsearch:
rest.uris: http://127.0.0.1:9200
Entity class
package com.sunyuqi.es.entity;
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;
//索引库名为index_name,类型为article,分片为5,每片备份1片
@Document(indexName = "index_name", type = "article",shards = 5,replicas = 1)
public class Article {
@Id
@Field(type = FieldType.Long, store = true)
private long id;
@Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
private String title;
@Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
private String content;
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 getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
ElasticsearchRepository interface
The custom interface needs to inherit the ElasticsearchRepository interface. The interface method naming rules are similar to spring data jpa, and there is no need to implement specific interface methods.
package com.sunyuqi.es.repositories;
import com.sunyuqi.es.entity.Article;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface ArticleRepository extends ElasticsearchRepository<Article, Long> {
List<Article> findByTitle(String title);
List<Article> findByContent(String content);
List<Article> findByTitleOrContent(String title, String content);
List<Article> findByTitleOrContent(String title, String content, Pageable pageable);
}
springboot boot class
package com.sunyuqi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootElasticsearchApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootElasticsearchApplication.class, args);
}
}
Test class
package com.sunyuqi;
import com.sunyuqi.es.entity.Article;
import com.sunyuqi.es.repositories.ArticleRepository;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.metrics.ParsedAvg;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.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.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootElasticsearchApplication.class)
class SpringbootElasticsearchApplicationTests {
@Autowired
private ArticleRepository articleRepository;
@Autowired
private ElasticsearchRestTemplate template;
//添加文档
@Test
public void addDocument() throws Exception {
for (int i = 0; i <= 20; i++) {
//创建一个Article对象
Article article = new Article();
article.setId(i);
article.setTitle("测试的标题" + i);
article.setContent("测试的内容"+i);
//把文档写入索引库
articleRepository.save(article);
}
}
@Test
public void deleteDocumentById() throws Exception {
articleRepository.deleteById(1l);
//全部删除
// articleRepository.deleteAll();
}
//查询所有文档
@Test
public void findAll() throws Exception {
Iterable<Article> articles = articleRepository.findAll();
for (Article article : articles) {
System.out.println(article);
}
}
//根据ID查询
@Test
public void testFindById() throws Exception {
Article article = template.get("14", Article.class);
System.out.println(article);
}
//匹配标题,精准匹配
@Test
public void testFindByTitle() throws Exception {
List<Article> list = articleRepository.findByTitle("标题");
for (Article article : list) {
System.out.println(article);
}
}
//匹配标题或者内容
@Test
public void testFindByTitleOrContent() throws Exception {
Pageable pageable = PageRequest.of(1, 5);
List<Article> articles = articleRepository.findByTitleOrContent("maven", "内容", pageable);
for (Article article : articles) {
System.out.println(article);
}
}
//分词查询
@Test
public void testNativeSearchQuery() throws Exception {
//创建一个查询对象
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("内容包含").defaultField("content"))
.withPageable(PageRequest.of(0, 15))
.build();
//执行查询
SearchHits<Article> search = template.search(query, Article.class);
List<SearchHit<Article>> searchHits = search.getSearchHits();
for (SearchHit<Article> searchHit : searchHits) {
System.out.println(searchHit.getContent());
}
//获取聚合结果
if (search.hasAggregations()) {
ParsedAvg parsedAvg = search.getAggregations().get("avg_price");
Assertions.assertNotNull(parsedAvg, "无聚合结果");
System.out.println(parsedAvg.getValue());
}
}
}
If the index library does not exist when adding a document, it will be created automatically