Elasticsearch 집계 결과 페이징 쿼리

1. Elasticsearch는 집계 후 페이징을 지원하며 그 이유는 무엇입니까?

아니요, Elasticsearch 직원이 어떻게 해석했는지보세요.
1) 성능 관점- 집계 된 페이징으로 인해 많은 레코드에서 성능 문제가 발생합니다.
2) 정확성 관점 -집계 된 문서 수가 정확하지 않습니다.
두 번째 페이지의 첫 번째 항목이 첫 번째 페이지의 마지막 요소보다 많은 수를 갖는 등 이상한 일이 발생할 수 있습니다.

2. Elasticsearch는 집계 후 페이징을 구현하기 위해 무엇을해야합니까?

솔루션 : 조건을 충족하는 총 데이터 수를 표시해야합니다. 즉, 전체 데이터를 집계하고 특정 규칙에 따라 정렬해야합니다.
집계하려는 데이터의 양이 많으면 (100,000, 수백만 또는 수천만) 필연적으로 속도가 느려지고 시간이 초과 될 수 있습니다.

1 단계 : 전체 집계, 크기가 최대 값 인 2147483647로 설정됩니다 .
ES5.X / 6.X 버전은
32 비트 운영 체제에서 가장 큰 기호 정수 상수 인 2 ^ 31-1과 같은 2147483647로 설정되고 ES1.X 2.X 버전은 0으로 설정됩니다.

예 :

  "aggregations": {
    
    
    "statistics_assets": {
    
    
      "terms": {
    
    
        "field": "one_account.one_account_no",
        "size": 2147483647,
        "order": {
    
    
          "assets": "asc"
        }

      },
      "aggregations": {
    
    
        "assets": {
    
    
          "sum": {
    
    
            "field": "assets.merge"
          }
        }
      }
    }
  }

집계 결과가 수백 또는 수천에 불과하므로 위의 크기는 최대 값 인 2147483647로 설정됩니다 (한 번에 반환 할 수없는 집계 결과가 많은 경우 논의 될 bucket_sort 사용을 고려하십시오.) 집계 결과가 한 번에 반환 된 후에는 결과의 지정된 부분을 얻기 위해 매개 변수를 페이징 할 수 있습니다 (Java는 목록 또는 LinkedHashMap에 저장할 수 있으며 HashMap 저장 순서가 변경 될 수 있음).

2 단계 : 집계 결과를 메모리에 저장하고 Java를 사용하여 목록 또는 맵 저장을 고려합니다.

3 단계 : 메모리 내 페이징, 목록에 저장된 데이터가 페이징되고 Java로 반환됩니다.
페이지 당 10 개의 데이터가있는 경우 첫 번째 페이지는 목록에서 0 ~ 9 번째 요소를 가져 오는 식입니다.

요약 :
이 기사에서 설명하는 방법은 집계 된 데이터의 양이 크지 않고 집계 된 결과가 많지 않은 경우 모든 집계 된 결과가 반환 된 다음 Java 백엔드가 목록을 사용하여 저장하고 페이지를 표시하는 것입니다.

단점 :
그러나이 메서드의 데이터 양이 너무 많으면 es 집계 중에 시간이 초과되어 매우 느려지고 집계 결과가 많이 생성되면 한 번에 Java 측으로 돌아 가지 않습니다. 집계 된 데이터가 적고 집계 된 결과를 한 번에 반환하지 않으려는 경우 bucket_sort 사용을 고려할 수 있습니다
. 예를 들면 다음과 같습니다.

"aggregations": {
    
    
    "statistics_assets": {
    
    
      "terms": {
    
    
        "field": "one_account.one_account_no",
        "size": 245645500
      },
      "aggregations": {
    
    
        "assets": {
    
    
          "sum": {
    
    
            "field": "assets.merge"
          }
        },
        "assets_bucket_sort": {
    
    
          "bucket_sort": {
    
    
            "sort": {
    
    
              "assets": {
    
    
                "order": "desc"
              }
            },
            "from": 0,
            "size": 10
          }
        }
      }
    }
  }

다음 공식 문서 또는 기사를 참조하십시오.
버킷 정렬 집계 편집
쿼리 집계에 버킷 정렬을 추가하는 방법
Aggregation + sorting + pagination in elastic search

집계 된 데이터가 많고 bucket_sort를 사용할 수없는 경우에는 미들 오피스 또는 데이터 부서에서 새 필드를 추가하도록하는 것이 좋습니다. 그러면 데이터가 다시 처리되고 계산되어 집계 될 데이터가 새로 추가 된 필드에 추가되므로 집계 할 필요없이 필드의 값을 직접 가져옵니다.

참조 기사 :
Elasticsearch 사후 집계 페이징 심층 설명

추천

출처blog.csdn.net/qq_33697094/article/details/109820792