Spring Data [Spring Data ElasticSearch, 쿼리 방식 Spring Data MongoDB, Spring Data 사례] (3) - 종합적인 상세 설명(학습 요약 --- 입문부터 심화까지)

 

목차

Spring Data ElasticSearch 쿼리 방식

스프링 데이터 몽고DB

Spring Data Solr 공통 레시피

 스프링 데이터 케이스


 

4 스프링 데이터 ElasticSearch 쿼리 방법

4.1 Repository에서 상속된 메서드를 사용하여 문서 조작

ElasticsearchTemplate은 인덱스 라이브러리의 운영을 주로 담당하며, Repository에서 상속받은 메소드를 사용하여 문서에 대한 작업을 수행할 수 있습니다.

4.2 명명 규칙 질의 문서

es의 명명 규칙은 기본적으로 jpa의 명명 규칙과 동일하며 일반적인 규칙은 다음과 같습니다.

4.3 기본 메서드를 사용하여 문서 쿼리

 ES 자체는 퍼지 쿼리, 쿼리 전 단어 분할 등과 같은 일부 특수 쿼리를 지원합니다. @Query 주석을 사용하여 인터페이스 메서드에서 쿼리 조건을 사용자 지정할 수 있습니다. 좋다:

@Query("{\n" +
    " \"fuzzy\": {\n" +
    " \"productName\": {\n" +
    " \"value\":\"elasticsearch\",\n" +
    " \"max_expansions\":1\n" +
    " }\n" +
    " }\n" +
    "}")
List<Product> findByProductNameFuzzy(String productName);
@Query("{\n" +
    " \"query_string\": {\n" +
    " \"query\": \"?0\",\n" +
    " \"default_field\": \"productName\"\n" +
    " }\n" +
    "}")
List<Product> findByProductNameString(String productName);

4.4 페이지 매김 쿼리

리포지토리의 커스텀 또는 상속된 메서드를 사용할 때 매개 변수에 Pageable 매개 변수를 추가하고 반환 값은 Page type이 되어 페이지 매김 쿼리를 완료합니다.

4.5 템플릿을 이용한 ElasticSearch 운영

SpringDataElasticsearch는 템플릿 모드 작업도 지원하므로 ElasticsearchRestTemplate 객체를 클래스에 주입해야 합니다.

4.5.1 동작 지표

        (1) 템플릿은 인덱스 작업 개체를 얻기 위해 IndexOperations indexOps(Class clazz)를 호출합니다.

        (2) IndexOperations의 일반적인 방법:

                create(): 인덱스를 생성합니다. 참고: 이 방법은 인덱스 구조를 설정할 수 없으며 프레임워크에 버그가 남아 있습니다.

                delete(): 인덱스 삭제

4.5.2 문서 추가, 삭제 및 수정

템플릿 조작 문서에 대한 일반적인 방법:

        save(): 문서 추가/수정

        delete(): 문서 삭제

4.5.3 문서 쿼리

템플릿의 검색 방법은 문서를 쿼리할 수 있습니다.

SearchHits 검색(쿼리 쿼리, 클래스 clazz): 쿼리 문서, 쿼리는 쿼리 조건 개체, clazz는 결과 유형입니다.

1. 일반 쿼리: 쿼리 개체 빌드

// 构建查询条件
// 单词查询
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("productDesc", "科幻");
// 模糊查询
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("productName", "三体
").maxExpansions(2);
// 先分词后查询
QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("我喜欢三
体").defaultField("productName");
// 构建 Query 对象
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(termQueryBuilder).build();

결과를 쿼리하고 처리합니다.

// 查询
SearchHits<Product> search = template.search(query, Product.class);
System.out.println(search.getMaxScore());
System.out.println(search.getTotalHits());
for (SearchHit<Product> productSearchHit : search) {
    System.out.println(productSearchHit.getContent());
}

2. 복잡한 조건의 쿼리

String productName = "三";
String productDesc = null;
// 构建查询条件
BoolQueryBuilder defaultQueryBuilder = QueryBuilders.boolQuery();
if(productName != null){
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("productName", productName);
    defaultQueryBuilder.should(termQueryBuilder);
}

if(productDesc != null){
    FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("productDesc", productDesc).maxExpansions(2);
    defaultQueryBuilder.should(fuzzyQueryBuilder);
}
// 构建 Query 对象
NativeSearchQuery query = new NativeSearchQueryBuilder()
    .withQuery(defaultQueryBuilder).build();

3. 페이징 쿼리

// 构建 Query 对象
Pageable pageable = PageRequest.of(0,5);
NativeSearchQuery query = new NativeSearchQueryBuilder()
    .withQuery(defaultQueryBuilder)
    .withPageable(pageable)
    .build();

// 查询
SearchHits<Product> search = template.search(query, Product.class);

// 封装页面对象
Page<Product> page = new PageImpl(search.toList(),pageable,search.getTotalHits());
System.out.println(page.getTotalElements());
System.out.println(page.getTotalPages());
System.out.println(page.getContent());

4. 쿼리 정렬

SortBuilder sortBuilder = SortBuilders.fieldSort("id").order(SortOrder.DESC);
NativeSearchQuery query = new NativeSearchQueryBuilder()
    .withQuery(defaultQueryBuilder)
    .withSort(sortBuilder)
    .build();

六、 스프링 데이터 MongoDB

1 컨셉

MongoDB는 크로스 플랫폼, 문서 지향 비관계형 데이터베이스로 가장 기능이 풍부한 비관계형 데이터베이스이자 관계형 데이터베이스와 가장 유사한 제품입니다. 지원하는 데이터 구조는 매우 느슨하고 JSON과 유사한 형식이므로 더 복잡한 데이터 유형을 저장할 수 있습니다.

MongoDB에는 주로 다음과 같은 개념이 있습니다.

 문서는 관계형 데이터베이스의 레코드와 같습니다.

 여러 문서가 관계형 데이터베이스의 테이블과 같은 컬렉션을 형성합니다.

 여러 컬렉션이 하나의 데이터베이스로 구성되며 MongoDB 인스턴스는 여러 데이터베이스를 지원합니다.

MongoDB와 관계형 데이터베이스의 개념 비교:

Spring Data MongoDB는 mongodb-driver를 캡슐화한 SpringData 기술의 산물이며 MongoDB를 보다 간단하게 운영할 수 있습니다. 

2 몽고DB 설치

2.1 몽고DB 설치

2.2 MongoDB 시각화 도구 RoBo 3T 설치

3.3 RoBo 3T는 MongoDB에 연결하여 데이터베이스를 생성합니다. 

3 Spring Data MongoDB 프로젝트 구축

1. SpringBoot 프로젝트를 생성하고 생성 시 Spring Data MongoDB 스타터 종속성을 추가합니다.

2. 구성 파일 작성

spring:
    data:
       mongodb:
        uri: mongodb://localhost:27017/数据库名

3. 엔터티 클래스 만들기

@Document("article")
public class Article {
    @Id
    private Integer id;
    private String title;
    private String content;
    // 省略 getter/setter,构造方法,tostring
}

4. MongoRepository 인터페이스를 상속할 Repository 인터페이스 생성

5. 테스트 클래스에 리포지토리 주입

Spring Data MongoDB의 4가지 일반적인 방법

1. Repository 인터페이스에서 상속된 메서드

2. 페이징 쿼리

3. 명명 규칙 쿼리

七、 Spring Data Solr

1 컨셉

Solr는 Apache Lucene 위에 구축된 검색 엔진 도구입니다. 이 기능은 ElasticSearch와 유사하며 Solr에는 다음과 같은 개념이 있습니다.

 콜렉션/코어: 동일한 데이터 형식의 콜렉션으로 데이터베이스의 테이블과 비교할 수 있으며 solr 클러스터에서는 콜렉션, 독립형 환경에서는 코어라고 합니다.

 문서: 문서는 관계형 데이터베이스 테이블의 레코드와 유사한 Solr 색인 및 검색의 가장 기본 단위입니다.

 field: 필드 또는 도메인은 데이터베이스의 테이블에 있는 필드로 이해할 수 있습니다.

Solr 및 관계형 데이터베이스의 개념 비교:

참고: Spring은 2020년부터 Spring Data Solr의 유지 관리를 중단했으며 Spring은 ElasticSearch를 검색 엔진으로 사용할 것을 권장합니다. SpringBoot는 버전 2.4.0 이후의 Spring Data Solr 모듈을 지원하지 않으므로 여기에서 간단히 배울 수 있습니다.

2 솔라 설치

1 solr zip 아카이브의 압축을 풉니다.

2 solr 설치 경로 아래에 bin 디렉토리를 입력하고 cmd 콘솔을 연 다음 solr.cmd start를 입력하여 solr을 시작합니다.

3 http://localhost:8983/solr을 방문하여 solr 그래픽 관리 인터페이스에 들어갑니다.

3 Spring Data Solr 시작하기 사례

1 코어 생성

(1) solr 설치 디렉토리 아래의 server\solr에 코어 데이터를 저장할 폴더를 생성합니다.

(2) solr 설치 디렉터리 아래에 있는 server\solr\configsets\_default\conf 폴더를 새로 만든 디렉터리에 복사합니다.

(3) solr 그래픽 관리 인터페이스에서 코어 추가를 클릭하여 코어를 생성합니다.

2 springboot 프로젝트를 생성하고 Spring Data Solr 모듈을 추가하며 springboot 버전은 2.4.0보다 높지 않아야 합니다.

3 구성 파일 쓰기

spring:
    data:
        solr:
            host: http://localhost:8983/solr/

4 엔티티 클래스 생성

@SolrDocument(solrCoreName = "product")
public class Product {
    @Field
    private String id;
    @Field
    private String productName;
    @Field
    private String productDesc;
    // 省略 getter/setter,构造方法,tostring
}

5 SolrCrudRepository 인터페이스를 상속할 Repository 인터페이스 생성

6 Repository 및 Template 객체를 테스트 클래스에 주입하고 저장 방법을 테스트합니다.

Spring Data Solr의 4가지 일반적인 방법

1 템플릿 개체의 메서드

2 Repository 인터페이스에서 상속된 메서드

3 페이지네이션 쿼리

4 명명 규칙 쿼리

여덟, 스프링 데이터 케이스

1 사례 소개 아래에서는 Spring Data 기술을 포괄적으로 사용하는 사례를 사용합니다.사례는 전자 상거래 웹 사이트의 제품 관리를 기반으로 제품 관리, 최신 제품 조회, 댓글 관리, 제품 검색 및 기타 기능을 포함합니다. 다음과 같은 특정 분석:

상품 데이터는 기본 정보와 상품 상세 정보로 구분되어 각각 mysql의 상품 테이블과 상품 상세 테이블에 저장된다.

최신 상품 질의는 최근 추가된 상품을 말하며 프로모션 상품은 실제 개발 시 노출될 수 있습니다. 비교적 많은 방문수,

레디스 스토리지를 사용합니다. 상품 리뷰는 데이터 양이 많고 데이터 가치가 낮아서 mongodb에 저장합니다. 전체 텍스트 검색은 ES를 이용하여 구현하는데, 이 경우 데이터는 ES에 직접 삽입되며, 실제 개발에서는 logstash를 사용하여 데이터베이스에서 동기화할 수 있습니다.

 

2 기능 분석 

3 프로젝트 건설

3.1 소프트웨어 준비

mysql, Redis, RedisDesktopManager, ElasticSearch, kibana, MongoDB, Robo 3t를 열고 mysql에 데이터베이스를 생성합니다.

3.2 프로젝트 생성

Springboot 프로젝트를 생성하려면 시작 종속성을 도입해야 합니다: spring data jpa, mysql 드라이버, spring data elasticsearch, spring data redis, spring data mongodb, spring web 

3.3 구성 파일

server:
  port: 80
  context-path: /
spring:
  # 数据源
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///shopping?serverTimezone=GMT%2b8
    username: root
    password: root
jpa:
    database: MySQL
    show-sql: true
    generate-ddl: true
    hibernate:
      ddl-auto: update
      naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
      # 解决属性使用驼峰命名法无法与数据库字段向匹配
      naming:
         physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
 redis:
    # Redis 服务器主机。
    host: localhost
    # Redis 服务器端口。
    port: 6379
    jedis:
        pool:
        # 连接池在给定时间可以分配的最大连接数。
        max-active: 8
        # 连接池中空闲连接的最大数量。
        max-idle: 8
        # 连接池中空闲连接的最小数量。
        min-idle: 0
 elasticsearch:
    rest:
        uris: http://localhost:9200
 data:
    mongodb:
        uri: mongodb://localhost:27017/product

4 엔티티 클래스 생성

产品实体类
@Entity
public class Product implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; // 主键
    private String productName; // 产品名
    private Double price; // 价格

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "data_id")
    private ProductData productData; //产品详情

    @Transient
    private List<Comment> comments = new ArrayList(); //评论
  }


产品详情实体类
@Entity
public class ProductData implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; // 主键
        private String productDesc;//产品详情
    }

产品 ES 实体类
@Document(indexName = "product",replicas = 2,shards = 5)
public class ProductES {
    @Id
    @Field(type = FieldType.Text,index = true,store = true)
    private Integer id;
    @Field(type = FieldType.Text,index = true,store = true,analyzer =
"ik_smart",searchAnalyzer  = "ik_smart")
    private String productName; // 产品名
    @Field(type = FieldType.Text,index = true,store = true,analyzer =
"ik_smart",searchAnalyzer = "ik_smart")
    private String productDesc;// 产品介绍
    @Field(type = FieldType.Double,index = false,store = true)
    private Double price;
}


评论实体类
@Document("comment")
public class Comment implements Serializable {
    @Id
    private Integer id; // mongodb 不能实现主键自增
    private Integer pid; // 产品 id
    private String username; // 评论人
    private String content; // 评论内容
}

5 리포지토리 생성

public interface ProductRepository extends JpaRepository<Product, Integer>, JpaSpecificationExecutor<Product>
public interface ProductESRepository extends ElasticsearchRepository<ProductES,Integer>
public interface CommentRepository extends MongoRepository<Comment,Integer>

6 컨트롤러 만들기

我们设计 resultful 风格的接口:
@PostMapping("/product")
@ResponseBody
public Result saveOrUpdateProduct(@RequestBody Product product) {
    return null;
}

@DeleteMapping("/product/{id}")
@ResponseBody
public Result deleteProduct(@PathVariable Integer id) {
    return null;
}

@GetMapping("/product/new")
@ResponseBody
public Result newProduct() {
    return null;
}

@PostMapping("/comment")
@ResponseBody
public Result saveComment(@RequestBody Comment comment) {
    return null;
}

@DeleteMapping("/comment/{id}")
@ResponseBody
public Result deleteComment(@PathVariable Integer id) {
    return null;
}

@GetMapping("/product/{id}")
@ResponseBody
public Result findProduct(@PathVariable Integer id) {
    return null;
}

@GetMapping("/product/search")
@ResponseBody
public Result search(String keyword, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "5") int size) {
    return null;
}

7 서비스 비즈니스 로직 작성

      많은 비즈니스 로직이 있습니다. 특정 코드는 첨부된 코드를 참조하십시오.

8 Postman 도구를 사용하여 인터페이스 테스트

      우편 배달부는 인터페이스 디버깅 소프트웨어입니다. HTTP 요청을 편리하게 보내는 데 사용할 수 있습니다.

Supongo que te gusta

Origin blog.csdn.net/m0_58719994/article/details/132005063
Recomendado
Clasificación