(7)elasticsearch의 정렬과 페이지 나누기 문제

8329 단어 elasticsearch

1、elasticsearch는 텍스트 형식을 정렬합니다


정렬의 과정은 실질적으로 필드의 원시 내용을 정렬하는 과정이다. 이 과정에서 역렬 인덱스는 역할을 발휘하지 못하기 때문에 정렬 인덱스를 사용해야 한다. 즉, 문서 id와 필드를 통해 필드의 원시 내용을 신속하게 얻을 수 있다.
es는 다음과 같은 2중 구현 방식을 제공합니다.
  • fielddata 기본 비활성화;
  • docvalues는 텍스트 형식을 제외하고 기본적으로 사용됩니다.

  • fielddata와 doc values는 다음과 같습니다.
    대비
    fielddata
    docvalues
    작성 시기
    검색 시 즉시 생성
    인덱스할 때 생성, 역렬 인덱스 생성 시기와 일치
    위치 만들기
    jvm heap
    디스크
    이점
    추가 디스크 자원을 사용하지 않음
    heap 메모리를 사용하지 않음
    결점
    문서가 너무 많을 때, 즉시 만드는 데 너무 많은 시간이 걸리고, 너무 많은 힙 메모리를 차지한다
    인덱스 속도 감소(io 과다), 추가 디스크 자원 사용
    fielddata 소개:
  • fielddata는 기본적으로 닫힙니다.
  • 이때 문자열은 분사 후의term에 따라 정렬되기 때문에 종종 결과가 기대에 부합되기 어렵다.
  • 은 일반적으로 분사에 대해 집합 분석을 할 때 열린다.
  • 문법은 다음과 같다.
  • PUT testindex/_mapping
    {
        "doc": {
            "properties": {
                "name": {
                    "type": "text",
                    "fielddata": true
                }
            }
        }
    }
    

    docvalues 설명:
  • docvalues는 기본적으로 사용되며 색인을 만들 때 닫을 수 있습니다.
  • 그러나fielddata처럼 수시로 열 수 없으며, 다시 열 때reindex 조작이 필요합니다
  • 2. 페이지 나누기와 훑어보기


    (1)from+size
  • 은 기본적으로 사용하고 소개하지 않는다.
  • 깊이 있는 페이지 나누기 문제.페이지 수가 깊을수록, 문서 처리가 많을수록, 메모리를 많이 사용할수록 시간이 오래 걸린다.가능한 한 깊이 있는 페이지 나누기를 피하고es는 index를 통과합니다.max_result_윈도우 매개 변수는 최대 10000개의 데이터로 제한됩니다.

  • (2)scroll
  • 문서 집합의api를 두루 돌아다니며 스냅숏으로 페이지를 깊이 나누는 문제를 피한다.
  • scroll은 실시간 검색에 사용할 수 없습니다. 데이터가 실시간이 아니기 때문입니다.(어느 순간 데이터의 스냅샷을 가져와서 최신 데이터가 들어오지 않기 때문)
  • 복잡한 sort 조건은 사용하지 말고 _doc가 가장 효율적입니다.

  • (3)search after
  • 깊이 있는 페이지별 성능 문제를 피하고 실시간 다음 페이지 문서 획득 기능을 제공한다.
  • from 파라미터를 사용할 수 없고 페이지 수를 지정할 수 없다는 단점이 있다.
  • 다음 페이지만 있고 이전 페이지는 할 수 없습니다.

  • (4) 장면 적용
    유형
    장면
    from+size
    맨 위에 있는 문서의 일부를 실시간으로 가져오고 자유롭게 넘기는 것이 필요합니다.
    scroll
    모든 데이터를 내보내는 기능과 같은 모든 문서가 필요하며, 실시간으로 페이지를 자유롭게 넘길 필요가 없다.
    search after
    모든 문서가 필요하고, 실시간으로 필요하지만, 자유롭게 페이지를 넘길 필요는 없다.

    3. nested 정렬


    DSL은 다음과 같습니다.
    GET test/_search
    {
      "query": {
        "nested": {
          "path": "clientInfo",
          "query": {
            "nested": {
              "path": "clientInfo.requestInfo",
              "query": {
                "match": {
                  "clientInfo.requestInfo.uri": "hello"
                }
              }
            }
          }
        }
      },
      "sort": [
        {
          "common.time": {
            "nested": {
              "path": "common"
            }, 
            "order": "desc"
          }
        }
      ] 
    }
    

    JAVA 코드는 다음과 같습니다.
    transportClient.prepareSearch("index").setTypes("doc").setQuery(queryBuilder).setPreference(preference)
                    .addSort(SortBuilders.fieldSort("common.time").setNestedSort(new NestedSortBuilder("common")).order(SortOrder.DESC))
                    .setSize(size).setFrom(from).execute().actionGet();
    

    참고: 홈페이지 nested 정렬

    좋은 웹페이지 즐겨찾기