복붙노트

[REDIS] 레디 스과의 화합물 검색어

REDIS

레디 스과의 화합물 검색어

학습 목적을 위해 나는 레디 스에서 간단한 구조의 문서 저장소를 작성하는 것을 시도하고있다. 내 예제 응용 프로그램에서 나는 다음과 같은 약간 보이는 문서의 수백만을 색인하고있다.

<book id="1234">
    <title>Quick Brown Fox</title>
    <year>1999</year>
    <isbn>309815</isbn>
    <author>Fred</author>
</book>

나는 나 년도 = 1999 TITLE = "빠른 갈색 여우"(다시, 내 학습, 나는 바퀴를 개혁하고있어 것을 상관 없어!)이 반환해야 말을 할 수있는 작은 쿼리 언어를 쓰고 있어요 ID는 일치 된 문서 (이 경우, 1234)의이다. 는 AND와 OR 표현 임의로 중첩 될 수 있습니다.

다음과 같이 각 문서를 들어 내가 생성 키를 해요

BOOK_TITLE.QUICK_BROWN_FOX = 1234
BOOK_YEAR.1999 = 1234

나는 = 양식 KEYNAME.VALUE에서 세트의 일련의 이러한 문서를 풍덩하는 {REFS을} SADD을 사용하고 있습니다.

나는 쿼리를 수행 할 때, 나는 AST로 표현을 구문 분석합니다. A는 나에게 다시 문서를 일치 세트를 가져옵니다 명령을 SMEMBERS 직접에 같은 YEAR = 1999지도와 같은 간단한 식입니다. 그러나, 나는 확실히 가장 효율적으로 AND 및 OR 부분을 수행하는 방법을 모르겠어요.

쿼리를 등을 감안할 때 :

(TITLE=Dental Surgery OR TITLE=DIY Appendectomy)
    AND
(YEAR = 1999 AND AUTHOR = FOO)

나는 현재 레디 스에 다음과 같은 요청이 쿼리에 응답 할 수 있습니다.

-- Stage one generates the intermediate results and returns RANDOM_GENERATED_KEY3
SUNIONSTORE RANDOMLY_GENERATED_KEY1 BOOK_TITLE.DENTAL_SURGERY BOOK_TITLE.DIY_APPENDECTOMY
SINTERSTORE RANDOMLY_GENERATED_KEY2 BOOK_YEAR.1999 BOOK_YEAR.1998
SINTERSTORE RANDOMLY_GENERATED_KEY3 RANDOMLY_GENERATED_KEY1 RANDOMLY_GENERATED_KEY2

-- Retrieving the top level results just requires the last key generated
SMEMBERS RANDOMLY_GENERATED_KEY3

나는 발생과 나는 두 아이의 키를 기준으로 SINTERSTORE를 사용 (위해 유사 및 OR 나는 SUNIONSTORE 사용)합니다. 나는 무작위의 결과를 저장하는 키를 생성 (내가 cruft에 최대 레디 스를 기입하지 않도록 짧은 TTL을 설정). 명령이 시리즈의 말에 반환 값은 내가 SMEMBERS과 결과를 검색하는 데 사용할 수있는 키입니다. 내가 저장 기능을 사용했습니다 이유는 내가 수송 싶지 않아 모든 문서 참조 내가 레디 스 인스턴스에 결과를 저장 임시 키를 사용하고 만에서 일치하는 결과를 다시 가져올 수 있도록, 서버에 백업 일치 끝.

내 질문은 단순히이 문서 저장소로 레디 스의 사용을 할 수있는 가장 좋은 방법은?

해결법

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

    1.나는 전체 텍스트 인덱싱을 구현하기 위해 정렬 된 세트와 유사한 접근 방식을 사용하고 있습니다. 당신이 만들 수있는 매우 간단 개선의 몇 가지 있기는하지만 전체적인 접근 방식은 좋다.

    나는 전체 텍스트 인덱싱을 구현하기 위해 정렬 된 세트와 유사한 접근 방식을 사용하고 있습니다. 당신이 만들 수있는 매우 간단 개선의 몇 가지 있기는하지만 전체적인 접근 방식은 좋다.

  2. from https://stackoverflow.com/questions/5695826/compound-queries-with-redis by cc-by-sa and MIT license