elasticsearch filter bitset

elasticsearch filter bitset에 대한 모든 것


ES를 사용하여 조회를 할 때, 당신은 필터의 각종 복합에 깊이 빠졌다는 것을 자주 발견할 수 있다.다음 요구 사항을 충족하는 사용자를 필터링해야 한다고 가정하십시오.

bitset


우선 비트셋이 어떻게 작동하는지 봐야 합니다.기본적으로bitset은 상태를 나타내는 목록이다.각 위치는 0이 아니면 1입니다.
필터는 문서에 점수를 매기지 않습니다. 포함하거나 거부할 뿐입니다.문서가 필터와 일치하면bitset에서 1로 설정됩니다.그렇지 않으면 0으로 설정합니다.그래서 ES는 촘촘한bitset에 전체 단락의 필터 정보를 저장할 수 있다.
ES가 필터를 처음 실행할 때, 그는 루틴의 세그먼트 데이터 구조를 분석하여 어떤 것이 필터와 일치하는지 판단했다.그리고 이 정보를 비트셋에 저장할 것이다.다음에 같은 필터가 실행될 때 ES는 Lucene 세그먼트가 아닌 압축된 Bitset을 찾을 수 있습니다.이것은 성능의 거대한 향상을 가져올 것이다.

제가 비트셋을 좋아하는 이유.


비트셋이 빠르다고 해도 과언이 아니에요.
비트에 따라 조작하는 것은 기초적인 계산 단원으로 CPU는 비트에 따라 조작하도록 전문적으로 설계되었다.하나의 메모리에 있는 비트 AND를 실행하는 것은 Lucene 데이터 구조를 분석하고 수동으로 교차 작업을 실행하는 것보다 몇 개의 수량 레벨이 빠르다.
여러 필터가 있는 경우 AND 작업을 통해 최종 일치하는 문서를 얻을 수 있습니다.
더 좋은 것은bitset이 검색 자체에 독립하여cache를 진행하는 것이다.복잡한 검색은 필터를 한 무더기로 사용할 수 있지만, 이 필터bitset은 독립적이며 다른 상하문 환경에서 사용할 수 있습니다.따라서 ES 재사용 필터가 매우 효율적입니다.
그리고bitset은 모든 segment를 대상으로 저장하기 때문에 ES는 매우 멋진 성능 기교를 만들 수 있다.Lucene 세그먼트는 변경할 수 없습니다. 디스크에 쓰기만 하면 변경되지 않습니다.
특정 필터가 세그먼트의 모든 문서와 일치하지 않으면 ES는 필터를 실행할 때 전체bitset을 무시할 수 있습니다.
이와 유사하게, 새로운 세그먼트가 추가되었을 때, 캐시의 필터bitset은 닫힐 필요가 없습니다.만약 당신이 새로운 문서를 mysql표에 인덱스한다면, 예를 들어 B-Tree 인덱스는 끊임없이 업데이트됩니다.
ES 필터 캐시를 사용하면 새로 만든 세그먼트만 필터bitset을 구축해야 하고, 오래된 bitset은 수정하지 않고 다시 사용할 수 있습니다.

boolean 아니면 and/or/not


"그런데 이게 나랑 무슨 상관이야?"그렇게 지도 모른다, 아마, 아마...
물론 중요합니다. bool 필터는 Bitset을 사용했기 때문에 and/or/not 필터는 없습니다. 만약에 term 필터를 and에 넣으면 존재하지만 Bitset을 사용하지 않습니다.
왜?
and/or/not는 문서와 문서로 이루어집니다.우선field 데이터 메모리 탱크에 넣어야 할 문서를 불러옵니다.비트셋이 사용되지 않을 뿐만 아니라, 캐시된 필터가 다시 사용되지 않을 것이다.ES는 문서의 목록을 간단히 스캔하고 각각을 독립적으로 검사합니다.
만약 필터가 여러 개 있다면, and/or/not는 단락 작업을 할 것입니다. 일치하는 문서만 다음 필터로 전달됩니다.
이것은 모든 후속적으로 실행해야 할 필터 작업량을 낮출 것이다.따라서 가장 무거운 필터는 마지막 위치에 놓아야 한다. 전형적인 예는 Geo 필터이다. 왜냐하면 그들은 거리를 정하기 위해 상당히 무거운 계산을 하기 때문이다.

언제 and/or/not


보아하니 Bool 필터는 어떤 면에서도 상대방을 능가하는 것 같다. 그러면 언제 and/or/not를 사용해야 합니까?
and/or/not는 비트셋으로 돌아가지 않는 필터를 사용할 때 더 효율적입니다.이 조작들은 틀림없이 모든 문서에 대해 한 번 진행해야 한다.예를 들어 맞춤형 스크립트는 모든 문서를 계산하기 때문에bitset화할 수 없습니다.
이러한 상황에서 and/or/not는bool보다 더 좋은 선택입니다..Non-Bitset 필터가 매우 적습니다. 아래에 열거하십시오.
  • Geo* filter
  • Scripts
  • Numeric_range

  • 다른 필터는 bool에 넣어야 돼요.

    bool과 and/or/not를 결합시키다


    이 두 가지를 필요로 하는 상황에 부딪혔을 때, 그들을 합쳐서 사용할 수 있다.항상 and/or/not를 사용하여 통합합니다.예를 들어 다음과 같은 데이터가 있습니다.
  • Gender: Male
  • Age: 23-26
  • Language: English
  • Custom Script
  • Geo

  • 필터 목록은 다음과 같습니다.
    {
      "and" : [
        {
          "bool" : {
            "must" : [
              { "term" : {} },
              { "range" : {} },
              { "term" : {} }
            ]
          }
        },
        { "custom_script" : {} },
        { "geo_distance" : {} }
      ]
    }

    총결산


    필터를 사용하면 간단한 배제 작업 대신bitset 작업을 사용하여 검색 성능을 향상시킬 수 있는 문서를 찾을 수 있습니다.우리가 필터를 통합할 때, 그들이 적합한 집합 필터의 종류를 사용하는 방법을 고려하는 데 시간이 걸렸는지 확인하십시오.
  • Geo, Script or Numeric_range filter: Use And/Or/Not Filters
  • Everything else: Use Bool Filter

  • from http://www.jianshu.com/p/627a4459975d

    좋은 웹페이지 즐겨찾기