[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.나는 전체 텍스트 인덱싱을 구현하기 위해 정렬 된 세트와 유사한 접근 방식을 사용하고 있습니다. 당신이 만들 수있는 매우 간단 개선의 몇 가지 있기는하지만 전체적인 접근 방식은 좋다.
나는 전체 텍스트 인덱싱을 구현하기 위해 정렬 된 세트와 유사한 접근 방식을 사용하고 있습니다. 당신이 만들 수있는 매우 간단 개선의 몇 가지 있기는하지만 전체적인 접근 방식은 좋다.
from https://stackoverflow.com/questions/5695826/compound-queries-with-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스 설정하고 해결의 관계를 분류 (0) | 2020.01.20 |
---|---|
[REDIS] sidekiq 노동자가 perform_async으로 수행 된 경우 확인하는 방법 레일 (0) | 2020.01.20 |
[REDIS] 비동기 레디 스는 libevent를 사용하여 풀링 (0) | 2020.01.20 |
[REDIS] 왜 레디 스에 대한 비동기 클라이언트를 사용하는 의미가 무엇입니까? (0) | 2020.01.20 |
[REDIS] Jedis 연결을 가져올 수 없습니다; 풀에서 리소스를 가져올 수 없습니다 (0) | 2020.01.20 |