>  기사  >  백엔드 개발  >  MySQL과 PHP에서 ES의 사용

MySQL과 PHP에서 ES의 사용

coldplay.xixi
coldplay.xixi앞으로
2020-09-01 17:36:384315검색

Ees 소개 高 확장성이 뛰어난 오픈 소스 전문 검색 및 분석 엔진으로 대용량 데이터를 실시간으로 빠르게 저장, 검색 및 분석할 수 있습니다. MySQL과 PHP에서 ES의 사용전체 텍스트 검색은 컴퓨터 색인 프로그램이 기사의 각 단어를 스캔하여 각 단어에 대한 색인을 구축하고 사용자가 쿼리할 때 기사의 단어 수와 위치를 나타내는 것을 의미합니다. 인덱스 검색 방법을 확립하고 검색 결과를 사용자에게 다시 제공합니다. 이 과정은 사전의 검색어 목록을 통해 단어를 찾는 과정과 유사하다. 검색 엔진 데이터베이스의 데이터에 대한 전체 텍스트 검색

ES가 mysql보다 빠른 이유

Mysql에는 용어 사전 레이어만 있으며 B-트리 정렬 방식으로 디스크에 저장됩니다. 용어를 검색하려면 여러 가지 무작위 액세스 디스크 작업이 필요합니다. Lucene은 검색 속도를 높이기 위해 용어 사전에 용어 색인을 추가합니다. 용어 색인은 트리 형태로 메모리에 캐시됩니다. 용어 색인에서 해당 용어 사전의 블록 위치를 찾은 후 디스크로 이동하여 용어를 찾으면 디스크에 대한 무작위 액세스 횟수가 크게 줄어 듭니다. 또한 인덱스라는 용어는 FST(유한 상태 변환기) 형식으로 메모리에 저장되므로 메모리를 매우 절약합니다. 용어 사전은 블록 단위로 디스크에 저장됩니다. 예를 들어 모든 단어가 Ab로 시작하는 경우 Ab는 생략될 수 있습니다. 이러한 방식으로 용어 사전은 b-tree보다 더 많은 디스크 공간을 절약할 수 있습니다.

동기화된 데이터베이스

우리는 데이터 저장을 위해 MySQL을 사용하고, 데이터 일관성을 유지하기 위해 MySQL의 트랜잭션 기능을 사용하며, 데이터 수집 및 쿼리를 위해 ElasticSearch를 사용합니다. 이때 es와 데이터베이스 간의 동기화 솔루션이 특히 중요합니다.

Process

먼저 제품을 데이터베이스에 추가하세요. 제품을 성공적으로 추가한 후 제품이 ES에 입력됩니다. ES 입력에 실패하면 실패한 제품 ID가 Redis 캐시 대기열에 들어가게 됩니다. 제품 ID가 로그 파일에 입력됩니다(redis 중단이 발생한 경우). 제품 ID가 손실된 경우 로그에서 비정상적인 제품 ID를 가져온 다음 이를 ES에 입력할 수 있습니다. 작업 작업은 Redis 캐시 대기열을 매 순간 새로 고칩니다. 둘째, 캐시 큐에서 제품 ID를 얻으면 제품 ID에 따라 데이터베이스에서 제품 데이터를 가져온 다음 ES에 입력합니다.

logstash-input-jdbc 플러그인을 사용하여 데이터베이스, 설치 및 구성을 동기화합니다. .conf 파일을 생성하고, 동기화할 데이터베이스와 실행할 .sql sql 문을 구성하고, 마지막으로 jdbc 드라이버를 넣습니다. 이 폴더에 다음으로 mysql 데이터베이스에 연결하는 데 사용됩니다

[관련 학습 권장 사항:

mysql tutorial

]가능한 문제elasticsearch 데이터 복제 및 증분 동기화

아래 기본 구성으로, Tracking_column 값은 @timestamp 입니다. _id 값은 elasticsearch에 저장되는 시점입니다. 이 값의 주요 기능은 mysql의 기본 키와 유사합니다. 타임스탬프는 실제로 항상 변경되므로 select 문을 사용하여 쿼리할 때마다 데이터가 Elasticsearch에 저장되므로 데이터가 중복됩니다.

해결 방법

쿼리할 테이블에서 기본 키 또는 자동 증가 필드를 찾아 _id 값으로 설정합니다. _id 값이 고유하므로 중복된 _id가 있는 경우 데이터가 생성되지 않습니다. 반복

빈번한 데이터 동기화는 mysql 데이터베이스의 성능에 영향을 미칩니다

우리가 jdbc.sql 파일에 작성하는 mysql 문은 하드 코딩되어 있어서 매번 쿼리되는 많은 데이터베이스를 쿼리할 필요가 없으며, 특히 매번 쿼리를 선택할 때 * 표에서; mysql 데이터베이스에 많은 부담을 줍니다

해결책:

(1) 비즈니스 요구에 따라 예약된 동기화 시간을 적절하게 수정할 수 있습니다. 여기서는 실시간 요구 사항이 상대적으로 높기 때문에 10분 일정 설정 => "*/10 * * * *"

(2) 많은 수의 쿼리가 데이터베이스를 드래그하지 않도록 mysql 쿼리 범위를 설정합니다. WHERE autoid > :sql_last_value;

sql 문에서 Elasticsearch의 저장 용량이 계속 늘어나고 있습니다

elasticsearch 데이터 보안을 위해 데이터를 받은 후 먼저 메모리와 트랜스로그에 데이터를 쓴 다음 인덱스를 생성하여 디스크에 씁니다. , 갑작스러운 정전이 발생하더라도 다시 시작한 후 translog를 통해 복원할 수 있습니다. 그러나 쿼리할 때마다 중복된 데이터가 많고 이러한 중복된 데이터는 elasticsearch 인덱스에 기록되지 않으므로 누적됩니다. Elasticsearch 용량이 계속 증가합니다

해결책:

쿼리 공식 홈페이지에는 정기적으로 새로 고쳐지고 오래된 로그가 자동으로 정리되므로 처리가 필요하지 않다고 나와 있습니다.

증분 동기화 및 mysql 범위 쿼리로 인해 mysql 데이터베이스가 작동할 때 이전 데이터와 동기화할 수 없습니다. 수정되었습니다.

매번 MySQL 소규모 쿼리를 해결하여 데이터베이스 압박 문제를 해결했으나, 오래된 데이터의 수정을 동기화할 수 없는 문제가 발생했습니다.

해결책:

업무 상황에 따라 할 수 있습니다. 데이터베이스가 자주 수정되면 전체 업데이트만 할 수 있지만, 데이터베이스를 높은 빈도와 넓은 범위로 스캔하여 인덱싱하는 것이 전혀 인덱싱하지 않는 것보다 낫습니다(인덱싱도 비용이 많이 들기 때문입니다). 자주 수정되지 않는 데이터로 인해 데이터베이스 성능이 많이 소모됩니다. 여기서는 데이터 수정이 적고 일반적으로 수정 사항은 최근 데이터입니다. 동기화하는 동안 mysql 범위를 약간 조정했기 때문입니다

php ES

php 작곡가를 사용하여 Composer require elasticsearch/elasticsearch를 설치합니다
es 파일 자동 로드 .php를 소개합니다. 파일, IP 주소 설정
인덱스 생성, 인덱스는 MySQL의 인덱스가 아닌 관계형 데이터(이하 MySQL)의 데이터베이스에 해당합니다
데이터베이스를 갖는 것만으로는 충분하지 않습니다. 테이블을 생성해야 합니다. ES, ES의 경우에도 마찬가지입니다. in의 유형은 MySQL의 테이블에 해당합니다. type은 별도로 정의되지 않지만 본문에 정의된 필드와 함께 정의됩니다. 물론 본문 필드에서 ik 단어 분할을 사용할 수도 있습니다.
검색을 구현하려면 EsClient->search()를 사용하세요. 동의어 및 동의어 사용

[관련 학습 권장 사항: php 프로그래밍(동영상)]

단어 분할기 구성: IK 구성

es의 ik 버전 패키지를 다운로드

만들기 es 디렉토리의 플러그인을 위한 ik 디렉토리에서 다운로드한 ik의 zip 패키지에 있는 모든 파일의 압축을 풉니다.
es의 config 디렉터리로 이동하여 elasticsearch.yml을 편집하고 빈 공간에 index.analytic.analyzer.default.type: “ik”을 추가합니다.
병음 단어 분할기 구성: 컴파일된 것 사용: elasticsearch-analytic-pinyin-1.3.0
elasticsearch의 플러그인 디렉토리에서 새로운 analyze-pinyin 폴더를 만들고, 압축된 패키지의 압축을 풀고, jar 패키지를 analyze-pinyin 안에 넣습니다. 접는 사람.
elasticsearch.yml에서 병음 토크나이저의 필터를 구성하세요

동의어 토크나이저 구성

elasticsearch.yml에서 동의어 토크나이저의 필터를 구성하세요

동의어 사전을 구성하고 elasticsearch .txt의 구성 디렉터리에 새 sysnonym을 생성하세요 .
주로 단어 분할기의 이름과 유형, 단어 요소 분할을 위한 구성 요소, 분할된 차원 처리를 포함하는 ik+pinying + 동의어 단어 분할기를 구성합니다. 여기에서는 병음과 동의어가 사용됩니다

ES 키워드 강조 표시

ES 쿼리 중 쿼리 후 필드 데이터에 html 태그 필드를 추가하면 웹 인터페이스에 표시될 때 문서의 형식이 색상이나 글꼴로 지정되고 강조 표시된 필드가 강조 표시로 수정됩니다. 이름 속성은 HTML 태그에 캡슐화되어 있습니다

ES 쿼리 페이징

Elasticsearch의 데이터는 샤드에 저장됩니다. 검색을 수행하면 각 샤드가 독립적으로 검색되어 데이터가 통합되어 반환됩니다.

일반적인 쿼리 프로세스는

1) 클라이언트 요청이 특정 노드로 전송됩니다.

2) 노드가 이를 각 샤드로 전달하고 각 샤드의 상위 10개 항목을 쿼리합니다.
3) 결과가 노드로 반환됩니다. 데이터가 통합되어 추출됩니다. 처음 10개의 항목
4)이 요청한 클라이언트에게 반환됩니다
항목 10부터 20까지의 데이터를 쿼리할 때 깊이 페이징(from-size)과 스냅샷 페이징(스크롤)의 두 가지 방법이 있습니다. ;
깊이 페이징(from-size)

from은 대상 데이터의 오프셋 값을 정의하고, 크기는 현재 반환되는 이벤트 수를 정의합니다. 기본값은 0이고 크기는 10입니다. 즉, 모든 쿼리는 기본적으로 처음 10개의 데이터만 반환합니다. 처음 20개의 데이터를 쿼리한 다음 처음 10개를 자르고 10~20개의 데이터만 반환합니다. 처음 10개의 쿼리가 낭비되었습니다. 페이징이 뒤로 갈수록 실행 효율성은 낮아집니다. 페이징 오프셋 값이 클수록 페이징 쿼리를 실행하는 데 시간이 더 오래 걸립니다

스냅샷 페이징(스크롤)

from 및 크기 페이징과 비교하여 스크롤을 사용하면 기존 데이터 커서를 시뮬레이션하고 현재 읽은 내용을 기록할 수 있습니다. 검색된 문서 정보 중 이 페이징의 용도는 실시간으로 데이터를 쿼리하는 것이 아니라, 한 번에 많은 양의 데이터(또는 모든 데이터)를 쿼리하는 것입니다. 이 스크롤은 현재 인덱스 세그먼트의 스냅샷 정보를 유지하는 것과 동일하므로 이 스냅샷 정보는 이 스크롤 쿼리를 실행할 때의 스냅샷입니다. 이 쿼리 이후에 새로 인덱싱된 데이터는 이 스냅샷에서 쿼리되지 않습니다. 그러나 from 및 size에 비해 모든 데이터를 조회하여 불필요한 부분을 제거하는 것이 아니라, 다음 읽기를 빠르게 계속할 수 있도록 읽기 위치를 기록합니다.

프로세스:

  • 호출: index/type/_search?pretty&scroll=2m, 스크롤 값 반환
  • scroll_id를 직접 사용하여 쿼리하세요.
  • 스크롤을 설정할 때 스크롤 생존 시간을 설정합니다. 하지만 사용 후 닫을 수 있으면 리소스를 조기에 해제하고 프로그래밍 학습에 대한 부담을 줄일 수 있습니다.
  • php training
칼럼을 주목해주세요!

위 내용은 MySQL과 PHP에서 ES의 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제