Elasticsearch 검색 조정 권위 있는 가이드(2/3)

본고는 vivo 인터넷 기술 위챗 공중번호 영문 원문에서 시작되었다.https://qbox.io/blog/elasticsearch-search-tuning-part-2저자: Adam Vanderbush 번역자: 양진도
카탈로그
  • 사전 인덱스 데이터
  • 비추다
  • 스크립트 사용을 피합니다
  • 읽기 전용 인덱스 강제 병합

  • Elasticsearch 검색 조정 권위 있는 안내서는 QBOX가 블로그에 발표한 시리즈 중 하나로 본고는 이 시리즈의 두 번째 편으로 색인 예처리, 맵핑 구축, 스크립트 사용 피하기, 색인 세그먼트 통합 등 검색 성능과 관련된 조정 방법을 소개했다.
    본고는 Elasticsearch 검색 조정 시리즈 3편 중 2편, 1편은 여기를 참고합니다(클릭).이 강좌는 Elasticsearch 5.0 및 상기 버전에 대한 검색 조정 기술, 전략과 건의를 더욱 토론하는 데 목적을 둔다.

    1. 사전 인덱스 데이터


    데이터의 색인 방식을 최적화하기 위해서는 조회에서 일부 모델을 미리 설정해야 한다.예를 들어 모든 문서에price라는 가격 필드가 있고 대부분의 조회가 고정된 범위 목록에서range 집합을 실행한다면 미리 색인 범위를 색인에 적용하고terms 집합을 사용하여 이 집합을 가속화할 수 있다.
    예를 들어 다음과 같은 문서가 있습니다.
    curl -XPUT 'ES_HOST:ES_PORT/index/type/1
    ?pretty' -H 'Content-Type: application/json' -d '{
     "designation": "bowl",
     "price": 13
    }'

    다음과 같은 검색 요청이 있습니다.
    curl -XGET 'ES_HOST:ES_PORT/index/_search
    ?pretty' -H 'Content-Type: application/json' -d '{
     "aggs": {
       "price_ranges": {
         "range": {
           "field": "price",
           "ranges": [
             { "to": 10 },
             { "from": 10, "to": 100 },
             { "from": 100 }
           ]
         }
       }
     }
    }'

    그리고 색인 단계에서 price_range 필드, 이 필드는 키워드로 매핑되어야 합니다.
    curl -XPUT 'ES_HOST:ES_PORT/index
    ?pretty' -H 'Content-Type: application/json' -d '{
     "mappings": {
       "type": {
         "properties": {
           "price_range": {
             "type": "keyword"
           }
         }
       }
     }
    }'
    
    curl -XPUT 'ES_HOST:ES_PORT/index/type/1
    ?pretty' -H 'Content-Type: application/json' -d '{
     "designation": "bowl",
     "price": 13,
     "price_range": "10-100"
    }'
    

    다음 검색 요청은price 필드에서 범위 집합을 실행하는 것이 아니라 이 새로운 필드를 집합할 수 있습니다.
    curl -XGET 'ES_HOST:ES_PORT/index/_search
    ?pretty' -H 'Content-Type: application/json' -d '{
     "aggs": {
       "price_ranges": {
         "terms": {
           "field": "price_range"
         }
       }
     }
    }'

    2. 매핑


    사실상, 일부 수치형 데이터는 항상 하나의 수치형 필드로 비추어야 한다는 것을 의미하지는 않는다.전형적으로, ISBN 같은 식별자나 다른 데이터베이스에 기록된 숫자를 표시하는 필드는 인덱스나 롱 형식보다 키워드로 비칠 수 있습니다.
    키워드 형식은 이메일 주소, 호스트 이름, 상태 코드, 우편 번호, 라벨 등 색인 구조화 내용에 사용됩니다.
    전형적으로 필터링 (예를 들어 발표된 모든 블로그 글 찾기), 정렬, 집합에 사용됩니다.키워드 필드는 정확한 값으로만 검색할 수 있습니다.
    전자 메일 내용이나 제품 설명 같은 색인 전문 내용이 필요하면 텍스트 필드를 사용해야 할 수도 있습니다.
    다음은 키워드 필드 매핑의 예입니다.
    curl -XPUT 'ES_HOST:ES_PORT/my_index
    ?pretty' -H 'Content-Type: application/json' -d '{
     "mappings": {
       "my_type": {
         "properties": {
           "tags": {
             "type":  "keyword"
           }
         }
       }
     }
    }'

    부터x 버전에서 가져온 인덱스는 키워드를 지원하지 않습니다.반대로, 키워드 형식을string 형식으로 낮추려고 시도합니다.이것은 새로운 맵과 낡은 맵을 통합하는 것을 지원합니다.장기적으로 존재하는 인덱스는 6으로 업그레이드해야 합니다.x 버전 전에 재구성하지만, 맵 다운그레이드는 자신의 계획에 따라 재구축을 실시할 수 있는 기회를 제공합니다.

    3. 스크립트 사용 피하기


    일반적으로 스크립트 사용을 최대한 피해야 한다.필요한 경우 Painless 및 표현식 엔진을 먼저 선택합니다.
    Painless는 Elasticsearch에서 사용하기 위해 설계된 간단하고 안전한 스크립트 언어로 Elasticsearch의 기본 스크립트 언어로 안전하게 스크립트를 연결하고 저장할 수 있습니다.Painless 문법과 언어 특성에 대한 자세한 설명은 Painless 언어 규범을 참조하십시오.
    "Painless Scripting in Elasticsearch"를 참조하여 Painless 스크립트 언어 안내서를 더욱 깊이 있게 이해하십시오.
  • Lucene 표현식 언어

  • Lucene 표현식은javascript 표현식을 바이트 코드로 컴파일하여 고성능 사용자 정의 평가와 정렬 함수에 사용하도록 설계하고 inline과 기본 저장 스크립트를 지원합니다.
  • 성능

  • 표현식은 사용자 정의 Lucene 코드에 비해 더욱 좋은 성능을 나타낸다.그 성능은 다른 스크립트 엔진에 비해 단일 문서 원가가 낮다. 표현식이 더욱 앞서는 것이다.
    이것은 특히 자신이 쓴 로컬 스크립트보다 훨씬 빠른 실행을 허용한다.
  • 문법

  • 표현식은 ja**vascript** 문법 서브집합을 지원합니다: 단독 표현식입니다.표현식 모듈의 문서를 참고하여 지원하는 조작부호와 함수를 이해하십시오.
    표현식 스크립트에서 액세스할 수 있는 변수는 다음과 같습니다.
  • 문서 필드, 예를 들어doc['myfield'].value
  • 필드에서 지원하는 변수와 방법, 예를 들어doc['myfield'].empty
  • 스크립트에 전달된 매개 변수, 예를 들어 mymodifier
  • 현재 문서 득점,_score(script_score에서만 사용할 수 있음)

  • 표현식 스크립트는 script_score、script_fields, 정렬 스크립트 및 수치형 집합 스크립트는 표현식에 파라미터를 간단하게 설정하면 됩니다.

    4. 읽기 전용 색인 강제 병합


    읽기 전용 인덱스는 단일 세그먼트로 통합되면 매우 이득을 볼 수 있습니다.전형적인 상황은 시간 기반 인덱스입니다. 현재 시간 창의 인덱스만 새 문서가 되고, 낡은 인덱스는 읽기 전용이 됩니다.
    강제 병합 API는 API를 통해 하나 이상의 인덱스를 강제 병합할 수 있습니다.병합은 각 슬라이스의 Lucene 인덱스 세그먼트 수량과 관련이 있습니다.강제 병합 작업은 병합을 통해 세그먼트 수를 줄일 수 있습니다.
    이 호출은 합병이 완료되기 전에 막힐 것입니다.http 연결이 끊어지면 요청은 백그라운드에서 계속됩니다. 이전 강제 합병이 완료되기 전에 모든 새로운 요청이 막힙니다.
    curl _XPOST 'ES_HOST:ES_POST/twitter/_forcemer
    ge?pretty'

    강제 병합 API는 다음 요청 매개변수를 수용합니다.
  • max_num_segments - 병합될 세그먼트 수입니다.색인을 완전히 결합하려면 1로 설정합니다.기본적으로 하나의 합병이 실행되어야 하는지 간단하게 검사합니다. 만약 그렇다면 실행할 것입니다
  • only_expunge_deletes - 통합 프로세스가 삭제된 세그먼트만 지우는지 여부.Lucene에서 문서는 한 세그먼트에서 삭제되지 않고 삭제로 표시됩니다.하나의 세그먼트가 통합되는 과정에서 새로운 세그먼트가 생성될 수 있습니다. 이 세그먼트는 삭제를 포함하지 않습니다.이 태그 매개 변수는 삭제된 세그먼트만 병합할 수 있고 기본값은false입니다.이것은 한도값 index를 다시 쓰지 않습니다.merge.policy.expunge_deletes_allowed.
  • flush - 강제 합병 후flush 실행 여부, 기본값은true..
  • 좋은 웹페이지 즐겨찾기