2017-02-04 6 views
1

큰 문자열 목록 (사용자 이름, 약 350K 레코드 포함)이 있습니다. 나는 그것을 사전 적 순서에 따라 정렬하여 저장해야하며, 구성원 존재 *와 구성원 유사성 **을 효율적으로 검색 할 수 있어야합니다. Redis 정렬 된 세트는 작업의 데이터 유형과 유사합니다.대소 문자 구별법의 사전 정렬 방식으로 대소 문자 구분 정렬

그러나 나는 첫 번째 장애물에 떨어지는 것 같습니다. 특히, 중요한 요구 사항 중 하나는 같은 문자로 시작하는 한 다른 문자 사례를 함께 유지하는 것입니다. 예 : Benderbender은 모두 나란히 정렬되어야합니다. 그러나 redis 정렬 집합은 엄격한 사전 순서 규칙을 따르므로 대문자로 시작하는 모든 문자열은 기본적으로 모든 문자열이 소문자로 시작하기 전에 정렬됩니다 (예 : 은 a보다 앞에 있지만, A 이후).

이 문제를 해결할 수있는 방법이 있습니까? 또한 요구 사항을 충족시키기 위해 redis 정렬 된 세트를 사용하고 있습니까? 참고로 Redis 버전 2.8.4를 사용하고 있습니다. 미리 감사드립니다.


* 회원 존재 : 사용자 이름 주어진 N에게 주어진 이름

같은 대부분이다 저장된 사용자 이름을 올려 : 사용자 이름 주어진, 그것은 이미 설정 저장

** 회원의 모습으로 존재하는지 여부를 확인

+2

[대소 문자와 악센트를위한 문자열 정규화] (https://redis.io/topics/indexes#normalizing-strings-for-case-and-accents) – thepirat000

+0

@ thepirat000 : 이것은 훌륭한 글입니다. Redis 2.8.4에서는 사용할 수없는 ZRANGEBYLEX 만 사용합니다. 나는 이전 버전의 같은 것을 구현할 수 있습니다 : http://oldblog.antirez.com/post/autocomplete-with-redis.html, 제외 어 사전 적으로 불가 지론. –

답변

1

이름과 함께 특수 인코딩을해야합니다. 다음은 그 예입니다.

모든 이름의 길이가 100 자 미만이라고 가정 해 봅시다. 각 이름의 경우, 인코딩하려면 다음 단계를 수행 대문자의

  1. 기록 인덱스를 2 자리 : BeNd를 들어, 지수 0002이다. BeNd에서 bend
  2. encoded name 얻기 위해 소문자 이름으로 인덱스를 추가합니다 : bendbend0002-
  3. encoded name를 추가
  4. 는 소문자 이름을 가져 소문자로 이름을 대문자로 변환 정렬 된 세트로 : zadd key 0 bend0002
이런 식으로

, BeNdbend 나란히 정렬되어야한다.

검색을 수행하려면 동일한 인코딩 방법을 사용하여 주어진 이름을 인코딩하고 검색을 수행 한 다음 결과를 디코딩하십시오. encoded name은 대문자 색인을 기록하기 때문에 쉽게 해독 할 수 있습니다.

+0

Clever. 사용자 이름 문자열에 후행 0이 포함되어 있으면 어떻게됩니까? 예를 들어 사용자 이름 'Bender12300'을 상상해보십시오. –

+0

@HassanBaig는 소문자 이름과 인덱스 사이의 구분 기호로 모든 사용자 이름에 존재하지 않는 특수 문자를 사용합니다.예 : 구분 기호로'-'를 사용하고'Bender12300'을'bender12300-00'으로 인코딩하십시오. –

+0

@for_stack : 위의 솔루션은 대소 문자를 구별하지 않는 검색에도 사용할 수 있습니까? –