복붙노트

[REDIS] 레디 스 멀티 - 매개 변수 일치 찾기

REDIS

레디 스 멀티 - 매개 변수 일치 찾기

다음과 같이 나는, 일부 데이터 세트에 대한 일치 파인더 시스템을 만들어야합니다 :

개체의 집합이있다, 문자열로 식별 각 OBJECTID.

각 객체는 정확히 N 속성 파이가 있습니다. 각 속성 값은 문자열이다.

(실제 N = 8) N = 3 데이터베이스 예.

ObjectID: P1     P2    P3
--------------------------------
APPLE:    RED    ROUND FRUIT
ORANGE:   ORANGE ROUND FRUIT
CARROT:   RED    LONG  VEGETABLE

이 시스템은 개체 속성에 주어진 쿼리를 일치하며 Object의 집합을 반환해야합니다. 사용자가 사용자의 모든 속성 값을 지정해야합니다. 사용자가 사용자의 일부 또는 모든 속성은 "와일드 카드"*를 지정할 수 있습니다에 대한 대안으로, 모든 속성 값이 기준과 일치하는 것을 의미한다.

예 쿼리 :

P1  P2    P3        => Result
------------------------------------
*   ROUND FRUIT     => APPLE, ORANGE
RED LONG  VEGETABLE => CARROT
RED *     *         => CARROT, APPLE

이 모든 하찮게 SQL로 이루어집니다.

질문 : 레디 스에 그렇게 할 수있는 깔끔한 방법이?

내가 자기 교육 목적으로, 특히 레디 스 기반의 솔루션에 관심이 있습니다; 다른 DB를이 특정 질문에 대한 논외입니다.

업데이트 : 각 파이와 응용 프로그램 쪽 필터링에 대한 명시 적 OBJECTID의 목록과 사소한 솔루션은 나에게 깔끔한 충분히 보이지 않습니다 :-)

해결법

  1. ==============================

    1.당신이 여기서 뭘하려고하는 것은 역 색인이다.

    당신이 여기서 뭘하려고하는 것은 역 색인이다.

    각 열에 대해, 그것은 "설정"에 매핑합니다. 그런 다음 결과를 얻을 수있는 세트를 교차 할 수 있습니다.

    그래서 애플은 : RED ROUND 과일은 다음 삽입에 매핑 것이다 :

    SADD p1:RED APPLE
    SADD p2:ROUND APPLE
    SADD p3:FRUIT APPLE
    

    그럼, 내가 * ROUND 과일에 대한 조회 할 말을하자, 내가 할 것입니다 :

    SINTER p2:ROUND p3:FRUIT
    

    ROUND 세트와 P3 : 과일 세트이 명령하여 P2에있는 항목의 교차하고있다. 이것은 무엇 P1 ROUND와 과일, 배려하지 않은 모든 항목을 반환합니다.

    몇 가지 다른 예 :

    SMEMBERS p1:GREEN
    SINTER p1:RED p2:ROUND p3:FRUIT
    SUNION p1:RED p1:GREEN
    

    내 상기 응답은 교차 연산은 O (N * M) 때문에 약간의 계산 능력을 사용하는 것이다. 여기에 더 많은 메모리를 많이 그 일을하는 방법이 있지만, 효과적으로 인덱스를 precomputes 때문에 빠른 검색해야합니다.

    속성의 각 조합의 경우, 저장 세트가 키를합니다

    그래서 애플은 : RED ROUND 과일은 다음 삽입에 매핑 것이다 :

    SADD RED:ROUND:FRUIT APPLE
    SADD :ROUND:FRUIT APPLE
    SADD RED::FRUIT APPLE
    SADD RED:ROUND: APPLE
    SADD RED:: APPLE
    SADD :ROUND: APPLE
    SADD ::FRUIT APPLE
    SADD ::: APPLE
    

    그런 다음, 쿼리, 당신은 단순히 각각의 키에 액세스 할 수 있습니다. 예를 들어, * ROUND 과일은 단순히 것

    SMEMBERS :ROUND:FRUIT
    

    당신이 많은 차원을 때 분명히, 이것은 메모리의 측면에서 전혀 확장 성이 좋지 않지만, 매우 결과를 검색하기 위해 이따위됩니다.

  2. from https://stackoverflow.com/questions/7939365/multi-parameter-match-finder-with-redis by cc-by-sa and MIT license