Couchbase v6.5에서는 이제 전체 텍스트 검색이 Couchbase N1QL 쿼리 구성에 통합되었습니다. 이제 고객은 N1QL에서 직접 FTS 인덱스를 활용할 수 있습니다. 이를 통해 개발자는 단일 API로 N1QL의 정확한 술어 일치와 FTS의 강력한 검색을 결합할 수 있습니다.
관계형 데이터베이스를 사용하는 많은 애플리케이션 개발자가 직면하는 한 가지 지속적인 과제는 쿼리 성능입니다. 쿼리 성능 문제를 해결하기 위해서는 더 큰 데이터베이스 서버나 더 나은 인덱스를 확보하는 등 관계형 데이터베이스가 제공하는 기능으로 제한되는 경우가 많습니다.
Couchbase를 사용하면 N1QL 쿼리 성능도 유사한 구성 요소에 의존합니다. 그러나 관계형 RDBMS와 달리, 서비스 격리 아키텍처의 Couchbase는 쿼리 및 인덱스 서비스를 모두 독립적으로 확장할 수 있다는 것을 의미합니다. 적절한 크기 조정과 용량 계획을 통해 Couchbase는 다음과 같이 매우 빠른 성능을 제공할 수 있습니다. 알토로스 NoSQL 벤치마크 보고서.
쿼리 술어를 넘어서 - N1QL 및 검색
고객은 적절한 인덱스를 사용하여 쿼리에 대해 밀리초 단위의 응답 시간을 달성할 수 있습니다. 그러나 Couchbase GSI 인덱스에서 사용하는 쿼리 술어를 미리 알 수 없는 경우가 있습니다. 이상적인 솔루션은 사용 가능한 쿼리 술어의 모든 조합에서 작동할 수 있는 인덱싱 시스템을 갖추는 것입니다.
카우치베이스 적응형 인덱싱은 이러한 사용 사례 중 많은 부분을 해결할 수 있습니다. Couchbase 전체 텍스트 검색은 불규칙한 패턴 사용 사례에 대한 또 다른 접근 방식입니다. 문서의 모든 필드에 대해 텍스트 및 퍼지 검색 기능을 제공합니다.
아래의 활동 관리 문서를 살펴보겠습니다. 활동:
- 항상 고객(계정) 소유
- 고객 조직의 여러 연락처를 보유할 수도 있으며 여러 연락처 배열로 표시될 수 있습니다.
- 여러 사용자로 대표되는 여러 참가자를 포함할 수 있습니다.
- 약속 또는 작업 유형일 수 있으며, 둘 다 제목, 시작일, 마감일 등과 같은 특정 해당 속성이 있습니다.
- 작업 유형의 활동에는 할 일 목록의 배열이 있습니다.
사용 사례
콜센터의 서비스 담당자인 John은 고객과 통화하는 동안 모든 고객 활동을 검색해야 합니다. 고객은 John이 애플리케이션을 쿼리하기 위해 아래 값 중 하나 또는 여러 개를 제공할 수 있습니다:
- 활동 제목: 쿼리는 활동 제목의 어느 위치에서든 이 텍스트가 있는 모든 활동을 반환해야 합니다.
- 고객 이름: 입력한 고객 이름이 불완전할 수 있으므로 쿼리에서 와일드카드를 사용하여 고객 이름과 일치시켜야 합니다.
- 연락처 이름, 이메일 또는 전화 연락처: 고객은 연락처 세부 정보를 제공할 수도 있습니다. 이러한 정보는 불완전할 수도 있습니다.
- 참여자 이름: 고객은 또한 고객과 상호 작용하고 활동에 참여했던 Acme의 직원인 계정 관리자의 이름을 제공할 수 있습니다.
- 활동 날짜: 고객은 다양한 활동 날짜와 시간을 제공할 수 있습니다.
- 서비스 담당자는 위의 정보 중 하나 이상을 받을 수 있습니다. 패턴은 고정되어 있지 않습니다.
- 쿼리 응답 시간은 ~1초가 되어야 합니다.
- 데이터 양은 연간 3백만 건, 보존 기간은 3년입니다.
이 정보를 검색하는 데 어떤 어려움이 있나요?
- 고객이 제공할 수 있는 필드는 최대 8개까지이며, 이 중 필수 항목은 없습니다. 이는 인덱스 선택을 위해 인덱스 리딩 키가 있어야 하기 때문에 효율적인 GSI 인덱스 설계에 어려움이 될 수 있습니다. 결과적으로 GSI 지수는 모든 사례를 포괄할 수 없습니다.
- 와일드카드 매칭: 제공된 활동 제목, 고객 및 연락처 이름, 이메일 또는 전화가 불완전할 수 있으므로 정확한 N1QL 술어 매칭 기술이 작동하지 않을 수 있습니다.
- 연락처와 참가자는 모두 활동의 하위 객체입니다. JSON 데이터 모델에서 연락처와 참가자는 두 개의 개별 배열로 표현됩니다. 커버리지 인덱스가 필요한 경우 두 배열의 요소를 하나 이상 포함해야 합니다.
솔루션
1. 가장 간단한 접근 방식은 N1QL 술어를 사용하는 것입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
선택 메타(a).id, a.title, a.startDate, a.계정.이름, a.연락처, a.참가자 FROM crm a 어디 a.유형='활동' AND a.활동 유형='약속' AND ( LOWER(a.title) 좋아요 '1TP3인공지능%' AND LOWER(a.계정.이름) 좋아요 '%콜린스%' AND ANY c in a.연락처 만족 LOWER(c.이름) 좋아요 '%rogers%' END AND ANY c in a.연락처 만족 LOWER(c.이메일) = 'elliottpamela@gmail.com' END AND ANY c in a.연락처 만족 c.전화 좋아요 '%6816%' END AND ANY p in a.참가자 만족 LOWER(p.이름)좋아요 '%james%' END AND a.startDate 사이 '2016-08-29' AND '2016-08-30' ) |
다음 GSI 인덱스도 필요합니다:
1 2 3 4 5 6 |
만들기 INDEX CRM_액티비티_앱_스타트데이트_액시드_듀얼 켜기 `crm`(`활동 유형`,`startDate`,`accid`,`기간`) 어디 `유형` = '활동' 만들기 INDEX ACT_계정_이름_유형 켜기 `crm`(lower((`계정`).`이름`)) 어디 `유형` = '활동' 만들기 INDEX ACT_contacts_name_type 켜기 `crm`(DISTINCT 배열 lower(`c`.`이름`) FOR c in 연락처 END) 어디 `유형` = '활동' 만들기 INDEX ACT_contacts_email_type 켜기 `crm`(DISTINCT 배열 lower(`c`.`이메일`) FOR c in 연락처 END) 어디 `유형` = '활동' 만들기 INDEX ACT_contacts_전화_유형 켜기 `crm`(DISTINCT 배열 c.전화 FOR c in 연락처 END) 어디 `유형` = '활동' 만들기 INDEX ACT_참가자_이름_유형 켜기 `crm`(DISTINCT 배열 lower(`p`.`이름`) FOR p in 참가자 END) 어디 `유형` = '활동' |
위의 쿼리는 쿼리 성능을 개선하기 위해 사용 가능한 인덱스 중 하나 또는 전부를 사용할 수 있습니다. 그러나 쿼리 계획이 IntersectScan 연산을 사용해야 하기 때문에 여전히 성능 문제가 있을 수 있습니다.
2. FTS 지수 활용
Couchbase 전체 텍스트 검색은 정확하지 않은 검색 기능과 원하는 순서대로 필드를 검색할 수 있는 기능으로 인해 이 사용 사례에 도움이 될 수 있습니다. 다음은 검색 기준을 포괄할 수 있는 FTS 색인입니다.
2.1 CURL 사용 - Couchbase 5.5에서 지원됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
선택 메타(a).id, a.title,a.startDate, a.계정.이름, a.연락처, a.참가자 FROM CURL("http://localhost:8094/api/index/all_acts/query", {"요청":"POST","header":"콘텐츠 유형: 애플리케이션/json", "데이터": '{ "설명":false,"필드": ["*"], "하이라이트": {}, "query": {"접속사": [ {"field":"title","match": "인공 지능"} , {"field":"contacts.name","match":"rogers"} , {"field":"contacts.email","match":"eliottpamela@gmail.com"} , {"field":"contacts.phone","와일드카드":"*6816*"} , {"field":"participants.name","match":"james"} , {"field":"account.name","match":"collins"} , {"field":"startDate","start": "2016-08-29", "end":"2016-08-30", "inclusive_start": true, "포함_끝": true} ] } }', "user":"관리자:비밀번호"}) 결과 UNNEST 결과.조회수 h INNER JOIN crm a 켜기 (h.id = 메타(a).id) AND a.유형='활동' |
2.2 SEARCH_QUERY를 사용한 N1QL/FTS 통합 시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
선택 메타(a).id, a.title,a.startDate, a.계정.이름, a.연락처, a.참가자 FROM SEARCH_QUERY("all_acts",{"설명":false,"fields": ["*"],"하이라이트": {}, "query": {"접속사":[ {"field":"title", "match": "인공 지능"} , {"field":"연락처.이름", "match":"rogers"} , {"field":"연락처.이메일", "match":"eliottpamela@gmail.com"} , {"field":"연락처.전화", "와일드카드":"*6816*"} , {"field": "participants.name", "match":"james"} , {"field": "account.name", "match":"콜린스"} , {"field": "startDate","시작": "2016-08-29", "end":"2016-08-30", "inclusive_start": true, "inclusive_end": true} ] }} ) as 결과 UNNEST 결과.조회수 h INNER JOIN crm a 켜기 (h.id = 메타(a).id) AND a.유형='활동' |
2.3 N1QL 검색 술어를 사용한 N1QL/FTS 통합 사용 시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
선택 메타(a).id, a.title,a.startDate, a.계정.이름, a.연락처, a.참가자 FROM crm a 어디 a.유형='활동' AND a.활동 유형='약속' AND 검색(a, {"접속사": [ {"field":"title", "match": "인공 지능"}, {"field":"연락처.이름", "match":"rogers"}, {"field":"연락처.이메일", "match":"eliottpamela@gmail.com"}, {"field":"연락처.전화", "와일드카드":"*6816*"}, {"field": "participants.name", "match":"james"}, {"field": "account.name", "match":"콜린스"}, {"field": "startDate","시작": "2016-08-29", "end":"2016-08-30", "inclusive_start": true, "inclusive_end": true} ] }, {"index":"all_acts"}) /* 특정 인덱스 이름을 제공하는 것이 좋습니다 */. |
참고:
- 위의 예는 모든 술어를 단일 SEARCH() 함수로 결합하기 위해 접속사 구조와 함께 FTS 복합 쿼리를 활용합니다. 다음에 대한 자세한 내용은 Couchbase FTS 설명서를 참조하세요. FTS 쿼리 유형
- 위의 문은 필요한 검색 술어만 포함하도록 프로그래밍 방식으로 구성해야 합니다.
- FTS 인덱스 디자인에는 SEARCH() 함수에서 사용되는 필드가 포함되어야 합니다.
- N1QL 술어 a.type='activity' 는 FTS 인덱스 선택을 위한 쿼리에 반드시 존재해야 합니다.
N1QL SEARCH_QUERY 및 SEARCH 술어는 Couchbase v6.5에서 사용할 수 있는 N1QL/FTS 통합 기능의 일부이며, 문서가 제공되면 블로그에 업데이트할 예정입니다.
FTS 쿼리 구문에 대한 자세한 내용은 다음과 같이 확인하세요. https://docs.couchbase.com/server/6.0/fts/full-text-intro.html
N1QL 및 검색 요약:
- N1QL/FTS 통합을 통해 쿼리에서 FTS 검색 구문을 검색 술어로 직접 사용할 수 있습니다.
- N1QL 쿼리에서 FTS 인덱스를 사용하면 각 쿼리 패턴에 대한 정확한 인덱스가 필요하지 않습니다.
- N1QL/FTS는 개발자가 쿼리 성능 문제를 처리할 때 탐색할 수 있는 추가 옵션을 제공합니다.
- FTS 인덱스는 여러 필드를 어떤 순서로든 검색해야 하는 경우에 적합합니다.
- FTS 인덱스는 여러 배열의 필드를 검색해야 하는 경우에 적합합니다.
리소스
6.5의 기능이 마음에 드셨는지, 앞으로 비즈니스에 어떤 도움이 될지 여러분의 의견을 듣고 싶습니다. 댓글을 통해 의견을 공유해 주시거나 포럼.