Elasticsearch 소개 및 springboot에서의 사용

​데이터베이스를 사용

  1. 테이블에 수천만 개의 레코드가 있으면 이러한 성능 문제가 발생하고, 그 안에 막연하게 구성해야 하는 또 다른 텍스트 필드가 있으면 심각한 성능 문제가 발생합니다.
  2. 여전히 검색어를 분리할 수 없습니다. 예를 들어 위의 경우 이름이 "Zhang San"으로 시작하는 직원만 검색할 수 있습니다. "Zhang Xiaosan"을 검색하려는 경우 검색이 불가능합니다.
    일반적으로 데이터베이스를 사용하여 검색을 구현하는 것은 그다지 안정적이지 않으며 일반적으로 성능도 좋지 않습니다.

Elasticsearch는 오픈 소스(분산) 검색 엔진(분석 시스템)으로
Apache Lucene을 기반으로 개발된 분산 오픈 소스 검색 및 분석 엔진입니다.

  • 분산된 실시간 문서 저장소로, 각 필드를 색인화하고 검색할 수 있습니다.
  • 분산형 실시간 분석 검색 엔진
  • 수백 개의 서비스 노드 확장이 가능하며 PB 수준의 정형 또는 비정형 데이터를 지원합니다.

Elasticsearch는 영구 저장 , 통계 등 다양한 기능을 제공하는 최신 검색 엔진 입니다.

검색엔진이자 데이터베이스[비관계형 데이터베이스]이며, 트랜잭션 및 복잡한 관계를 지원하지 않습니다(최소 버전 1.X는 지원하지 않으며, 2.X는 개선되었으나 여전히 지원이 좋지 않습니다).

​전문 검색 : 전문 데이터베이스는 전문 검색 시스템의 주요 구성 요소입니다. 소위 전문 데이터베이스는 완전한 정보 소스의 전체 내용을 컴퓨터가 인식하고 처리할 수 있는 정보 단위로 변환하여 형성된 데이터 모음입니다. 전문 데이터베이스는 정보를 저장할 뿐만 아니라, 전문 데이터에 대한 단어, 문자, 단락 등을 추가로 편집하고 처리하는 기능도 갖고 있으며, 모든 전문 데이터베이스는 모두 대규모 정보 데이터베이스입니다.
예를 들어 "full disintegration"을 입력하면 "full"과 "disintegration"이라는 두 단어로 분할됩니다. 2개의 단어를 사용하여 반전된 인덱스의 데이터를 검색하고 검색된 데이터를 반환합니다. 전체 프로세스를 전체 텍스트 검색이라고 합니다.

​역색인 : 속성값을 기준으로 레코드를 찾는데, 레코드에 따라 속성값이 결정되는 것이 아니라, 속성값에 따라 레코드의 위치가 결정되므로 역색인이라고 합니다.
이러한 인덱스 테이블의 각 항목에는 속성 값과 해당 속성 값을 갖는 레코드의 주소가 포함됩니다.
반전된 인덱스가 있는 파일을 반전된 인덱스 파일, 줄여서 반전된 파일이라고 합니다.

Lucene은 오픈 소스 검색 엔진 툴킷(다양한 알고리즘을 포함하여 역 인덱스 구축 및 검색을 위한 패키지 코드가 포함된 jar 패키지)입니다. Solr도 Lucene을 기반으로 하는 오픈 소스 분산 검색 엔진입니다. Elasticsearch와 많은 유사점이
있습니다 .
Elasticsearch는 전체 텍스트 검색으로 시작하여 Lucene 개발 키트를 데이터 제품으로 만들어 Lucene의 다양하고 복잡한 설정을 보호하고 개발자에게 친숙한 편의성을 제공했습니다. 많은 기존 관계형 데이터베이스도 전체 텍스트 검색을 제공합니다. 일부는 내장된 Lucene 기반, 일부는 자체 개발 기반이며 Elasticsearch에 비해 기능이 단일하고 성능이 그다지 좋지 않으며 확장성이 거의 존재하지 않습니다.

ES는 이러한 문제를 해결합니다

1. 여러 노드에 인덱스를 설정하기 위한 데이터 배포 자동 유지 관리 및 여러 노드에 분산된 검색 요청 실행 2.
시스템이 다운되면 데이터가 손실되지 않도록 중복 데이터 복사본을 자동 유지 관리 3.
집계분석, 지리적 위치 기반 검색 등 고급 기능을 캡슐화

엘라스틱서치의 특징

  1. 대규모 분산 클러스터(수백 대의 서버) 기술로 PB 수준의 데이터를 처리하여 대기업에 서비스할 수 있으며, 단일 머신에서 실행하여 중소기업에 서비스할 수도 있습니다.
  2. Elasticsearch는 새로운 기술이 아니며 주로 전체 텍스트 검색, 데이터 분석 및 분산 기술을 결합합니다.
  3. 사용자에게는 즉시 사용 가능하고 매우 간단하며 중소 규모 애플리케이션으로서 3분 안에 ES를 직접 배포할 수 있습니다.
  4. Elasticsearch는 전체 텍스트 검색, 동의어 처리, 상관관계 순위 지정, 복잡한 데이터 분석, 대규모 데이터의 실시간에 가까운 처리 등 기존 데이터베이스를 보완합니다.

사용되는 장면

Elasticsearch를 유일한 데이터 저장소로 사용하여 새 프로젝트를 시작하는 경우 디자인을 최대한 단순하게 유지하는 데 도움이 될 수 있습니다. 그러나 이 시나리오는 빈번한 업데이트 및 트랜잭션과 관련된 작업을 지원하지 않습니다.

예는 다음과 같습니다 . 새 블로그 시스템을 만들고 es를 저장소로 사용합니다.
1) 새로운 블로그 게시물을 ES에 제출할 수 있습니다.
2) ES를 사용하여 데이터를 검색, 검색 및 계산할 수 있습니다.

시나리오 2: 기존 시스템에 Elasticsearch 추가
ES는 모든 스토리지 기능을 제공할 수 없으므로 일부 시나리오에서는 기존 시스템 데이터 스토리지를 기반으로 ES 지원을 추가해야 합니다.
여기에 이미지 설명을 삽입하세요
그림과 같이 SQL 데이터베이스와 ES 스토리지를 사용한다면 방법을 찾아야 합니다 使得两存储之间实时同步. 데이터와 데이터베이스의 구성에 따라 해당 동기화 플러그인을 선택해야 합니다. 사용 가능한 플러그인은 다음과 같습니다:

1) mysql, oracle 선택 logstash-input-jdbc플러그인. [운하도 OK]

2) mongo는 mongo-connector 도구를 선택합니다.

응용 쿼리
Elasticsearch는 쿼리에 가장 뛰어나며 역 인덱스의 핵심 알고리즘을 기반으로 B-Tree 유형의 모든 데이터 제품, 특히 관계형 데이터베이스보다 쿼리 성능이 강력합니다. 데이터의 양이 수천만 또는 수억을 초과하면 데이터 검색의 효율성이 매우 분명해집니다.

Elasticsearch는 일반적인 쿼리 응용 시나리오에 사용됩니다.관계형 데이터베이스는 인덱스의 왼쪽 원칙에 의해 제한됩니다.인덱스 실행에는 엄격한 순서가 있어야 합니다.쿼리 필드가 적은 경우 적은 수의 쿼리를 생성하여 쿼리 성능을 향상시킬 수 있습니다. 쿼리 필드가 많아 필드의 순서가 어긋나면 인덱스의 의미를 잃게 되는데, 반대로 Elasticsearch는 기본적으로 모든 필드에 대해 인덱스를 생성하고 모든 필드 쿼리는 순서를 보장할 필요가 없으므로 우리는 많은 비즈니스 애플리케이션 시스템에서 일반 쿼리에 관계형 데이터베이스 대신 Elasticsearch를 사용합니다. 데이터베이스 쿼리는 매우 배타적입니다. 가장 간단한 쿼리를 제외하고 Elasticsearch는 기타 복잡한 조건 쿼리에 사용됩니다.
빅데이터 분야에서
Elasticserach는 외부 쿼리를 제공하는 빅데이터 플랫폼의 중요한 구성 요소 중 하나가 되었습니다. 빅 데이터 플랫폼은 원본 데이터를 반복적으로 계산한 다음, 특히 대용량 세부 데이터 배치의 경우 쿼리를 위해 결과를 데이터베이스에 출력합니다. ​유명한
로그 검색 3종 세트는 로그 수집, 저장, 쿼리를 위해 특별히 설계된 제품 포트폴리오를 의미합니다 . 5) 모니터링 분야 6) 머신러닝
ELKElasticsearch,Logstash,Kibana

ES 구성 요소에 대한 기본 소개

여기에 이미지 설명을 삽입하세요

문서 메타데이터
문서에는 해당 데이터뿐만 아니라 문서에 대한 정보인 메타데이터도 포함됩니다. 세 가지 필수 메타데이터 요소는 다음과 같습니다:
  _index   문서가 저장되는 위치
  _type    문서가 나타내는 객체
  _id        범주 문서의 고유 식별자


# ES는 springboot에서 사용됩니다
  • 종속성 소개

pom.xml가입하다spring-boot-starter-data-elasticsearch

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  • 구성 파일 작성
server:
  port: 9001
es:
  schema: http
  address: 192.168.0.1:9200
  connectTimeout: 10000
  socketTimeout: 20000
  connectionRequestTimeout : 50000
  maxConnectNum: 16
  maxConnectPerRoute: 20
  • 엔터티 클래스:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "shen")
public class User {
    
    
    @Id 
    private String id;

    // 用在属性上 代表mapping中一个属性 一个字段 type:属性 用来指定字段类型 analyzer:指定分词器
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String name;

    @Field(type = FieldType.Integer)
    private Integer age;

    @Field(type = FieldType.Text)
    private Date bir;

    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String introduce;

    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String address;
}
  • es에 문서 삽입
	/**
	 * ElasticSearch Rest client操作
	 *
	 * RestHighLevelClient 更强大,更灵活,但是不能友好的操作对象
	 * ElasticSearchRepository 对象操作友好
	 *
	 * 我们使用rest client 主要测试文档的操作
	 **/
	// 复杂查询使用:比如高亮查询
	@Autowired
    RestHighLevelClient restHighLevelClient;

    @Override
    public ResponseInfo addUsers(User user) throws IOException {
    
    
        IndexRequest indexRequest = new IndexRequest("shen");
        indexRequest.source(JSONObject.toJSONString(user), XContentType.JSON);
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        return ResponseInfo.ok(indexResponse);
    }
  • 통화 인터페이스
    여기에 이미지 설명을 삽입하세요
  • Kibana를 사용하여 es에서 결과를 확인하세요.
    여기에 이미지 설명을 삽입하세요
    /**
     * 更新
     */
	@Override
    public ResponseInfo updateDoc(User user) throws IOException {
    
    
        Document document = user.getClass().getAnnotation(Document.class);
        UpdateRequest updateRequest = new UpdateRequest(document.indexName(), user.getId());
        updateRequest.doc(JSONObject.toJSONString(user), XContentType.JSON);
        UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        return ResponseInfo.ok(updateResponse);
    }

    /**
     * 删除
     */
    @Override
    public ResponseInfo deleteDoc(User user) throws IOException {
    
    
        Document document = user.getClass().getAnnotation(Document.class);
        DeleteRequest deleteRequest = new DeleteRequest(document.indexName(), user.getId());
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        return ResponseInfo.ok(deleteResponse);
    }

    /**
     * 批量更新
     */
    @Override
	public void bulkUpdate() throws IOException {
    
    
        BulkRequest bulkRequest = new BulkRequest();
        // 添加
        IndexRequest indexRequest = new IndexRequest("shen");
        indexRequest.source("{\"name\":\"张三\",\"age\":23,\"bir\":\"1991-01-01\",\"introduce\":\"西藏\",\"address\":\"拉萨\"}", XContentType.JSON);
        bulkRequest.add(indexRequest);
        // 删除
        DeleteRequest deleteRequest01 = new DeleteRequest("shen","pYAtG3kBRz-Sn-2fMFjj");
        DeleteRequest deleteRequest02 = new DeleteRequest("shen","uhTyGHkBExaVQsl4F9Lj");
        DeleteRequest deleteRequest03 = new DeleteRequest("shen","C8zCGHkB5KgTrUTeLyE_");
        bulkRequest.add(deleteRequest01);
        bulkRequest.add(deleteRequest02);
        bulkRequest.add(deleteRequest03);
        // 修改
        UpdateRequest updateRequest = new UpdateRequest("shen","pYAtG3kBRz-Sn-2fMFjj");
        updateRequest.doc("{\"name\":\"曹操\"}",XContentType.JSON);
        bulkRequest.add(updateRequest);

        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        BulkItemResponse[] items = bulkResponse.getItems();
        for (BulkItemResponse item : items) {
    
    
            System.out.println(item.status());
        }
    }
/**
     * 查询
     * @throws IOException
     */
    @Test
    public void testSearch() throws IOException {
    
    
        //创建搜索对象
        SearchRequest searchRequest = new SearchRequest("shen");
        //搜索构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        searchSourceBuilder.query(QueryBuilders.matchAllQuery())//执行查询条件
                .from(0)//起始条数
                .size(10)//每页展示记录
                .postFilter(QueryBuilders.matchAllQuery()) //过滤条件
                .sort("age", SortOrder.DESC);//排序

        //创建搜索请求
        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println("符合条件的文档总数: "+searchResponse.getHits().getTotalHits());
        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit hit : hits) {
    
    
            System.out.println(hit.getSourceAsMap());
        }
    }





에스 공식 홈페이지

kibana 语法

ElasticSearch는 springboot에서 사용됩니다.

추천

출처blog.csdn.net/JemeryShen/article/details/126488385