elasticsearch 검색엔진의 상용 방법 (3) 10000개의 데이터를 찾은 후의 데이터

질문:
es 자체가 기본적으로 검색량을 10000개로 제한합니다. 즉from+size<=10000
오류 보고:
Result window is too large, from + size must be less than or equal to:[10000] but was [10010]. See the scroll api for a more efficient way to requestlarge data sets. This limit can be set by changing the[index.max_result_window] index level parameter

해결 방법:
1. es의 기본 설정을 수정합니다
1. config/elasticsearch.yml에 설정 추가
max_result_window: 1000000000

2,api를 사용하여 index의 설정을 수정합니다
#  es index 

PUT _all/_settings
{
  "index":{
    "max_result_window": 1000000000
    
  }
}

참고:
es도 max_result_윈도우의 크기는 최대 10억 원입니다.만약 당신이 검색한 양(from+size)이 10억 위안보다 크다면, 방법 2를 사용하십시오
 
2. search_ 사용after 방법
말 그대로 어떤 점 이후의 데이터를 찾기 위해from,size,sort,search_after.
페이지 넘기기 구현:search_after 자체는 무상태입니다. 지난 조회의 마지막 상태를 기록하고 이 상태부터 다음 조회를 해야 하기 때문에 또 하나의 통일된 정렬 필드가 필요합니다.
질의 방법:
1. 첫 번째 조회 문장
#  , date 

GET index_1/_search
{
  "from": 0, 
  "size": 10000, 
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    }
  ], 
  "query": {
    "match_all": {}
  }
}

상술한 문장을 조회한 후에 모든 결과에'sort'필드가 하나 더 나올 것입니다. 마지막 데이터의sort, 즉
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 20000,
    "max_score": null,
    "hits": [

    ......

      {
        "_index": "index_1",
        "_type": "type_1",
        "_id": "107686",
        "_score": null,
        "_source": {
          "content": " . . .",
          "date": "2019-09-20 13:42:38"
        },
        "sort": [
          1568986958000
        ]
      }
    ]
  }
}

2. 두 번째 조회 문장
#  1 10 

GET index_1/_search
{
  "from": -1, 
  "size": 10, 
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    }
  ], 
  "search_after":[1568986958000]
}

참고:
(1) 두 번째 조회는 첫 번째 조회 결과를 바탕으로 search_after의 값은 첫 번째 검색 결과의 마지막 데이터인sort입니다.
(2) 두 번째 조회의from은 반드시 -1이고from+size는 여전히 10000보다 크면 안 된다
(3) 페이지를 넘기려면 마지막 조회를 기록할 때마다sort

좋은 웹페이지 즐겨찾기