Redis 기반 검색엔진 RediSearch 사용

11802 단어 RediSearchRedis

RediSearch란?


RediSearch는 Redis가 제작한 오픈 소스를 바탕으로 한 전문 검색, 보조 인덱스 엔진이다.개발 측은 리디스의 저자 살바토르 산필립포도 재적 중인 리디스랩스, 인c.리디스를 기반으로 스피드를 매점으로 하고 있다.
리디스랩스백지에 따르면 일라스틱서치에 비해 처리량이 4배가량 차이가 난다.왜 이렇게 많은 성능을 가졌는지는 물론 레디스를 기반으로 한 것도 있지만 레디써치 자체는 레디스RedisModule를 확장한 API를 C 언어로 썼다.

별말씀을요. 레드스모듈의 다른 OSSrediSQL를 사용하는 레드스로서 SQL을 수행하는 상당히 야망적인 OSS입니다.관심 있으신 분들은 보세요.
참고로 본 보도는 v1입니다.6.14시 정보.v1.6.14時点では日本語の全文検索に対応していない 원하는 사람은 닫으세요.

Installation

docker run -p 6379:6379 redislabs/redisearch:latest
원본에서 설치하고 싶은 인삼 사진여기..

모드 생성(FT.CREATE)


RediSearch는 다른 Redis의 데이터 구조와 달리 문서를 추가하기 전에 패턴을 정의해야 합니다. 
FT.CREATE <INDEX名> <INDEXオプション> SCHEMA <FIELD名> <FIELDの型> <FIELDオプション>...
  • 필드의 수량은 1024로 제한됩니다.여기서 TEXT 필드의 최대 개수는 128개
  • 입니다.
  • 필드 유형
  • TEXT: 텍스트 유형
  • NUMERIC: 수치형
  • GEO: 위도 경도 좌표
  • 일반 옵션
  • NOHL: 고전평light를 Off로 설정하여 스토리지를 절약할 수 있음
  • NOFIELDS: 각 Field를 저장하지 않고도 스토리지를 절약할 수 있음
  • NOFREQS:Term frequency를 저장하지 않음(빈번함)으로 메모리를 절약할 수 있음
  • 일반적인 필드 옵션
  • SORTABLE: FT.SEARCH 명령을 통해 SORTABLE
  • 을 지정할 수 있습니다.
    예: 포켓몬 데이터 모드 해봐.
    FT.CREATE pokemon SCHEMA id NUMERIC name TEXT name_ja TEXT hp NUMERIC attack NUMERIC defence NUMERIC sp_attack NUMERIC sp_defence NUMERIC speed NUMERIC
    

    문서 추가(FT.ADD)

    FD.ADD <INDEX名> <DocID> <Score> <OPTIONS> FIELDS <FIELD名> <FIELDの値>...
    
  • DocID: 문서 식별자
  • 일반 옵션
  • REPLACE: SQL의 Upseart 운동을 합니다.기존 재생성 새로 만들기 또는 삭제
  • PARTIAL: 지정된 경우에만 유효합니다.몇 개의 필드를 생략하면 현재 값이 변하지 않습니다
  • 예: 포켓몬 색인에 개구리 씨앗 문서 추가하기
    FT.ADD pokemon Bulbasaur 1.0 FIELDS id 1 name Bulbasaur hp 45 attack 49 defence 49 sp_attack 65 sp_defence 65 speed 45
    
    그런 다음 Redis에 다음 키워드가 생성됩니다.
    127.0.0.1:6379> keys *
     1) "ft:pokemon/bulbasaur"
     2) "nm:pokemon/defence"
     3) "nm:pokemon/sp_attack"
     4) "nm:pokemon/hp"
     5) "idx:pokemon"
     6) "nm:pokemon/attack"
     7) "Bulbasaur"
     8) "nm:pokemon/id"
     9) "nm:pokemon/sp_defence"
    10) "nm:pokemon/speed"
    
    그중 REPLACEHash만들어졌고 안쪽을 들여다보면 이런 느낌이에요.
    127.0.0.1:6379> hgetall "Bulbasaur"
     1) "id"
     2) "1"
     3) "name"
     4) "Bulbasaur"
     5) "hp"
     6) "45"
     7) "attack"
     8) "49"
     9) "defence"
    10) "49"
    11) "sp_attack"
    12) "65"
    13) "sp_defence"
    14) "65"
    15) "speed"
    16) "45"
    
    다른 키는 RediSearch가 관리하는 색인 데이터로 일반적인 명령은 안을 볼 수 없습니다.
    127.0.0.1:6379> type "ft:pokemon/bulbasaur"
    ft_invidx
    127.0.0.1:6379> type "nm:pokemon/defence"
    numericdx
    
    참고로 패턴 정의에 없는 필드를 포함하면 색인을 만들 수 없지만 Hash에 등록됩니다.따라서 문서의 특정 필드만 인덱스하면서 Redis를 응용 프로그램 데이터베이스로 사용할 수도 있습니다.

    찾기("Bullbasaur")

    FT.SEARCH <インデックス名> <クエリ> <オプション>
    
  • 일반 옵션
  • FT.SEARCH: 검색 결과에만 docid
  • 표시
  • NOCONTENT: 표시 건수.기본값은 0 10입니다.왜 기본 상한선이 10...무한하겠지...
  • LIMIT first num: SORTBY field [ASC|DESC]가 있는 필드에서 정렬
  • SORTABLE: WITHSORTKEYS가 있는 필드에서 정렬

  • 이름으로 텍스트 찾기
    FT.SEARCH pokemon Bulbasaur
    

  • 지정한 필드에서 텍스트 찾기
    FT.SEARCH pokemon "@name:Bulbasaur"
    

  • 와일드카드 사용
    FT.SEARCH pokemon "@name:Bul*"
    

  • NUMERIC 영역 지정 범위 내SORTABLE에서 포켓몬 1개 검색
    FT.SEARCH pokemon "@id:[1 1]"
    
  • id 100이상 150이하의 포켓몬 검색
    FT.SEARCH pokemon "@hp:[50 100]"
    
  • hp 100 이상 150 이하 포켓몬 검색 hp 100 이상 150 이하
    FT.SEARCH pokemon "@hp:[50 100] @attack:[50 100]"
    
  • 성능


    아니면 성능이 신경 쓰이는 곳.Redis에서 직접 작성한 Hash에서 HGETALL과 FT.SEARCH를 통해 읽어들일 때의 속도를 비교합니다.

    컨디션

  • CentOS 7.4/i7-7700 8cores 3.6GHz/DDR4 16GB RAM

  • RediSearch는 다음 명령에 따라 실행됩니다.
  • attach

  • 동일한 호스트의 Redisearch 컨테이너docker run --network host -t redislabs/redisearch:1.6.14로 처리량 확인
  • 옵션은 redis-benchmark-c 64 -P 1 두 가지
  • 결실


  • GET로 데이터 얻기
    $ redis-benchmark -c 64 -P 1 -n 1000000 get foo
    151492.20 requests per second
    
    $ redis-benchmark -c 64 -P 128 -n 5000000 get foo
    3259452.25 requests per second
    

  • HGETALL에서 데이터 가져오기
    $ redis-benchmark -c 64 -P 1 -n 1000000 hgetall Bulbasaur
    129617.62 requests per second
    
    $ redis-benchmark -c 64 -P 128 -n 5000000 hgetall Bulbasaur
    838363.50 requests per second
    

  • 정확히 일치하는 검색
    $ redis-benchmark -c 64 -P 1 -n 1000000 FT.SEARCH pokemon Bulbasaur
    47714.48 requests per second
    
    $ redis-benchmark -c 64 -P 128 -n 1000000 FT.SEARCH pokemon Bulbasaur
    58840.83 requests per second
    

  • 와일드카드 앞에서 일관성 있게 읽어들이기
    $ redis-benchmark -c 64 -P 1  -n 1000000 FT.SEARCH pokemon "@name:Bul*"
    36892.20 requests per second
    
    $ redis-benchmark -c 64 -P 128  -n 1000000 FT.SEARCH pokemon "@name:Bul*"
    39684.12 requests per second
    

  • NUMERIC 필드 범위 검색
    $ redis-benchmark -c 64 -P 1 -n 1000000 FT.SEARCH pokemon "@id:[1 1]"
    57773.41 requests per second
    
    $ redis-benchmark -c 64 -P 128 -n 1000000 FT.SEARCH pokemon "@id:[1 1]"
    62410.28 requests per second
    
  • RediSearch2는 어떻게 되나요?


    RediSearch2는 2020년 9월 18일 발표된 최신 버전에서 1 시리즈와 호환되지 않습니다.가장 큰 변경점으로서 이전에 사용하지 않음-c 64 -P 128FT.ADD에 색인을 추가할 수 있다.한편, 데이터 구조가 HASH에만 한정된 것(앞으로도 HASH 이외의 제품을 지원할 것)도 단점이 있다.
    여기서 RediSearch2는 상세하게 소개하지 않았지만 똑같이 기준을 얻었으니 제가 가서 보겠습니다.

  • 색인 생성
    $ FT.CREATE idx:pokemon on hash prefix 1 pokemon: SCHEMA id NUMERIC name TEXT name_ja TEXT hp NUMERIC attack NUMERIC defence NUMERIC sp_attack NUMERIC sp_defence NUMERIC speed NUMERIC
    

  • 정확히 일치하는 검색
    $ redis-benchmark -c 64 -P 1 -n 1000000 FT.SEARCH pokemon Bulbasaur
    43965.71 requests per second
    
    $ redis-benchmark -c 64 -P 128 -n 5000000 FT.SEARCH pokemon Bulbasaur
    50563.79 requests per second
    

  • 와일드카드 앞에서 일관성 있게 읽어들이기
    $ redis-benchmark -c 64 -P 1  -n 1000000 FT.SEARCH pokemon "@name:Bul*"
    28401.02 requests per second
    
    $ redis-benchmark -c 64 -P 128  -n 1000000 FT.SEARCH pokemon "@name:Bul*"
    31661.60 requests per second
    

  • NUMERIC 필드 범위 검색
    $ redis-benchmark -c 64 -P 1 -n 1000000 FT.SEARCH pokemon "@id:[1 1]"
    43620.50 requests per second
    
    $ redis-benchmark -c 64 -P 128 -n 1000000 FT.SEARCH pokemon "@id:[1 1]"
    54071.59 requests per second
    
  • RediSearch를 써야 하나요?

  • 성능에 신경 쓰지 않는 간단한 키 검색 =>HSET 또는 KEYS에서 키 문자열을 검색하면 된다
  • 여러 조건에서 검색하는 것이 가장 좋을 수 있습니다 =>SCAN
  • SQL로 검색하고 싶은 =>RediSearch를 사용할 수 있습니다.하지만 원래 Redis에서 해야 할 일도 연구해 보는 게 좋을 것 같다
  • 총결산


    비즈니스에 RediSearch를 사용했기 때문에 소개해 드렸습니다.리디서치는 이미 Production ready에 많은 리디스를 사용하고 있고, 검색 등 많은 프로젝트라면 도입을 검토해볼 만하다고 본다.

    참고 문헌

  • RediSearch Github
  • RediSearch Documentation
  • Search Benchmarking: RediSearch vs. Elasticsearch
  • 좋은 웹페이지 즐겨찾기