elasticsearch 에서 filter 를 어떻게 효율적으로 사용 하 는 지
5592 단어 elasticsearch
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:
따라서 위의 몇 개 를 제외 하고 다른 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 순서 와 조합 문 제 를 고려 해 야 합 니 다.
본문 은 다음 과 같다. http://log.medcl.net/item/2013/09/elasticsearch-inside-the-various-filter/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kafka connect e elasticsearch를 관찰할 수 있습니다.No menu lateral do dashboard tem a opção de connectors onde ele mostra todos os clusters do kafka connect conectados atu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.