elasticsearch 에서 filter 를 어떻게 효율적으로 사용 하 는 지

5592 단어 elasticsearch
여기 아주 좋 은 글 이 있 습 니 다. 아주 좋 습 니 다. 번역 과 정 리 를 했 습 니 다. 영어 가 좋 습 니 다. 원문 을 직접 보 는 것 을 권장 합 니 다. http://euphonious-intuition.com/2013/05/all-about-elasticsearch-filter-bitsets/
elasticsearch 에 BOOL 이 들 어 있어 요.  filter 、AND、OR、NOT  filter 이 몇 개가 비슷 해 보이 는데 어떤 차이 가 있 나 요?언제 bool filter 을 사용 합 니까?AND filter 는 언제 사용 하나 요?
사실 bool filter 는 AND, OR, NOT filter 와 완전히 다 르 기 때문에 조회 성능 에 큰 영향 을 미친다.
 
먼저 우리 가 알 아야 할 것 은 filter 안에 어떻게 작 동 하 는 지 입 니 다. 그 중에서 핵심 적 인 것 은 BitSet 이 라 고 합 니 다. 아주 큰 bit 배열 로 이해 할 수 있 습 니 다. 배열 안의 모든 요 소 는 2 개의 상태 가 있 습 니 다. 0 과 1 (Bloom filter 는 알 고 있 습 니까?) 이 고 filter 는 문서 의 일치 여부 만 처리 하고 문서 의 평가 작업 과 관련 되 지 않 습 니 다.문서 가 filter 조회 와 일치 하면 대응 하 는 bit 위 치 는 1 로 설정 하고 일치 하지 않 으 면 0 으로 설정 합 니 다.
es 는 filter 조회 필 터 를 실행 할 때 lucene 의 모든 segment 세그먼트 파일 을 열 고 안의 문서 가 이 filter 에 부합 되 는 지 여 부 를 판단 합 니 다. 이 일치 하 는 결 과 는 bitset 로 저장 할 수 있 습 니 다. 다음 에 똑 같은 filter 로 조회 하면 메모리 안의 bitset 로 판단 하면 됩 니 다.lucene 의 segment 파일 을 더 이상 열 필요 가 없습니다. io 의 조작 을 피 할 수 있 습 니 다. 그러면 조회 처리 속 도 를 크게 향상 시 킬 수 있 습 니 다. 이것 도 filter 가 이렇게 효율 적 인 이유 입 니 다.
lucene 의 segment 세그먼트 파일 은 변 하지 않 기 때문에 lucene 은 새로운 세그먼트 가 생 길 수 있 습 니 다. 그러나 오래된 세그먼트 는 변 하지 않 기 때문에 bitset 는 중복 적 으로 이용 합 니 다. 서로 다른 filter 조건 과 서로 다른 세그먼트 에 따라 해당 하 는 bitset 이 생 길 수 있 습 니 다. 또한 서로 다른 조 회 는 여러 bitset 의 교 집합 과 관련 될 수 있 습 니 다. 컴퓨터 는 이런 bit 비트 비트 처리 과정 에 대해 매우 잘 알 고 속도 가 빠 릅 니 다.
또한, filter 의 결과 가 비어 있 으 면 안의 bitset 위 치 는 0 이 고, es 이후 이 filter 를 처리 할 때 이 bitset 전 체 를 무시 하고 성능 을 향상 시 킵 니 다.
앞에서 기본 내용 을 말 했 으 니 bool filter 와 AND filter 의 차 이 를 살 펴 보 자.
bool filter 는 앞에서 언급 한 bitset 데이터 구조 (bitset 파) 를 사용 하고, AND \ OR \ NOTfilter 는 bitset (non - bitset 파) 를 사용 할 수 없습니다. 왜 일 까요?
AND, OR, NOT filter 는 doc by doc 의 문서 처리 입 니 다. es 는 문서 안의 필드 내용 을 하나씩 불 러 온 다음 에 필드 의 내용 이 조회 조건 을 만족 하 는 지 확인 합 니 다. 만족 하지 않 는 문 서 는 결과 집합 에서 제외 하고 모든 문 서 를 한 번 지나 갈 때 까지 순서대로 반복 합 니 다. 이 중간 과정 은 앞에서 언급 한 bitset 를 사용 하지 않 습 니 다.캐 시 자원 을 중복 이용 할 수 없습니다.
만약 에 하나의 AND, OR, NOT 에 여러 개의 filter 여과 조건 (배열 을 지원 하 는 방식) 이 포함 되 어 있다 면 처리 논 리 는 모든 filter 가 생 성 된 결과 집합 을 다음 filter 로 순서대로 전달 하 는 것 입 니 다. 이론 적 으로 처리 하 는 문서 수 는 점점 적어 집 니 다. 여과 만 줄 이 고 증가 하지 않 기 때문에 순서대로 여과 합 니 다.따라서 일반적인 제한 조건 이 까다 로 우 면 앞 에 놓 고 실행 할 수 있 습 니 다. 그러면 뒤의 filter 가 처리 해 야 할 문서 수 는 매우 작 습 니 다. 그러면 전체적인 처리 속 도 를 크게 향상 시 킬 수 있 습 니 다. 또한 수량 적 인 고려 를 제외 하고 filter 의 효율 문 제 를 고려 해 야 합 니 다. 일부 filter 의 실행 효율 은 매우 낮 습 니 다. 예 를 들 어 Geo filter (대량 계산) 나 script based filter 등 입 니 다.(동적 스 크 립 트) 이러한 성능 비용 이 비교적 큰 조 회 를 마지막 에 실행 하여 전체적인 처리 속 도 를 높이 는 것 을 권장 합 니 다.
자, 이제 이러한 개념 이 있 을 것 입 니 다. AND, OR, NOT 는 문서 by 문서 입 니 다. 순서대로 처리 합 니 다. 만약 에 결과 집합 이 매우 크 고 여유 로 운 조회, 명중 이 많 으 면 AND, OR, NOT filter 를 사용 하 는 것 은 적합 하지 않 습 니 다. 그러나 일부 filter 는 문서 by 문서 로 처리 해 야 합 니 다. 예 를 들 어 아래 의 이 filter:
  • Geo* filters
  • Scripts
  • Numeric_range

  • 따라서 위의 몇 개 를 제외 하고 다른 filter 는 일률적으로 bool filter 를 사용 하여 조회 성능 을 향상 시 켜 야 합 니 다.
    검색 에 bitset 와 non - bitset 형식의 filter 를 동시에 사용 해 야 한다 면 bool filter 와 AND \ OR \ NOT filter 를 조합 해서 사용 할 수 있 습 니 다.
    앞에서 말 했 듯 이 AND 는 결과 집합 이 순서대로 뒤로 전달 되 기 때문에 우 리 는 성능 이 비교적 좋 은 것 을 앞 에 놓 고 non - bitset 은 AND 의 filter 뒤에 놓 습 니 다. 예 를 들 어 여러 filter 유형 을 포함 하 는 복잡 한 filter 입 니 다.
     
    {
      "and" : [
        {
          "bool" : {
            "must" : [
              { "term" : {} },
              { "range" : {} },
              { "term" : {} }
            ]
          }
        },
        {
          "or" : [
            { "custom_script" : {} },
            { "geo_distance" : {} }
          ]
        }
      ]
    }

     
    and 는 가장 바깥쪽 에서 wrapper 를 만 듭 니 다. 첫 번 째 filter 는 bool filter 입 니 다. 그 안에 must 의 서브 filter 가 3 개 있 습 니 다. 처리 한 후에 문서 결과 집 을 얻 은 다음 에 or 의 서브 filter 를 실행 합 니 다. OR 안에 두 개의 조회 가 각각 진행 되 고 최종 문서 결과 집 은 우리 의 검색 결과 입 니 다.
    한 마디 로 하면 filter 를 사용 할 때 는 bitset 흐름 을 우선 사용 하고 filter 순서 와 조합 문 제 를 고려 해 야 합 니 다.
  • Geo, Script or Numeric_range filter: 앤 드 / 오 르 / 노 트 필터 사용
  • 모든 기타: Bool Filter 사용
  • 이상 의 것들 을 파악 하면 고성능 조 회 를 쓰기 어렵 지 않다.
     
    본문 은 다음 과 같다. http://log.medcl.net/item/2013/09/elasticsearch-inside-the-various-filter/

    좋은 웹페이지 즐겨찾기