를 사용하는 SQL 쿼리를 몇 번이나 작성하셨나요? 좋아요 연산자와 와일드카드를 사용하여 문자열에서 텍스트를 찾을 수 있나요? 수백만 개의 레코드에 대해 실행했을 때 어떤 성능을 얻었나요? 아마 좋지 않았을 것 같죠?
SQL에서 와일드카드를 사용할 수는 있지만 대부분의 시나리오에 가장 적합한 방법은 아닐 수 있습니다. 여기에는 N1QL 쿼리가 포함됩니다. 대신, 한동안 사용되어 왔지만 최근에 포함된 기술인 전체 텍스트 검색(FTS)을 만나보세요. 카우치베이스 서버.
Couchbase에서 제공하는 전체 텍스트 검색은 다음을 기반으로 합니다. BleveGolang으로 작성된 검색 및 색인 라이브러리입니다.
카우치베이스에서 전체 텍스트 검색을 사용한 퍼지 검색
FTS를 와일드카드 N1QL 또는 SQL 쿼리와 비교할 때는 성능 측면 외에도 비교해야 할 것이 많습니다. 예를 들어 퍼지 방식으로 일치하는 기능을 생각해 보세요. 다음과 같은 쿼리가 있다고 가정해 보겠습니다:
|
1 |
선택 * FROM `기본값` 어디 메시지 좋아요 '%bananas%'; |
데이터베이스에 다음이 포함된 레코드가 있는 경우 어떻게 되나요? 바나나 대문자로 B? 이 경우에는 결과에 포함되지 않습니다. 저처럼 철자를 몰라서 다음과 같은 결과가 나오면 어떻게 되나요? 바나나 데이터베이스에 포함되지 않나요? 결과에도 포함되지 않습니다.
전체 텍스트 검색을 사용하면 퍼지 계수를 사용하여 다음과 같은 쿼리를 수행할 수 있습니다:
|
1 |
바나나~2 |
SQL과 FTS의 쿼리 구문이 다르다는 점을 무시하고 위와 같이 하면 두 가지 모호한 요소가 발생할 수 있습니다. 즉, 검색어에서 두 개의 문자를 변경하여 결과를 얻을 수 있다는 뜻입니다. 데이터에는 다음 중 어느 것이든 포함될 수 있습니다:
|
1 2 3 4 |
바나나 bannanna bana bnan |
위의 네 가지에 국한된 것은 아니지만, 대략적인 내용은 이해하실 수 있습니다.
하지만 데이터베이스에 다음이 포함되어 있다면 어떻게 해야 할까요? 두건 이 경우에는 입력 실수가 아닙니다. 합법적인 다른 항목에 대한 검색이 결과에 표시되기를 정말로 원하나요?
용어 또는 용어 집합에 대한 전체 텍스트 검색 쿼리를 실행할 때, 각 결과는 초기 검색 쿼리와 얼마나 관련성이 있는지에 따라 점수가 매겨집니다. 점수가 매겨진 결과를 중심으로 비즈니스 로직을 구성할 수 있습니다.
Couchbase 전체 텍스트 검색의 다양한 쿼리 유형
다양한 FTS 쿼리 유형 에서 수행할 수 있습니다. 지금까지 언급한 쿼리 유형은 검색어가 퍼지 여부와 관계없이 인덱스와 일치하는 데 사용되는 일치 쿼리로 가장 잘 분류됩니다.
다른 몇 가지 유형의 쿼리에는 다음이 포함되지만 이에 국한되지는 않습니다:
- 일치, 구문, 퍼지, 접두사, 정규식, 와일드카드, 부울 필드
- 연결, 연결 해제, 부울, 문서 ID
- 날짜 범위, 숫자 범위
- 쿼리 문자열
각 쿼리 유형은 서로 다른 작업을 위해 설계되었습니다. 각 쿼리의 기능에 대한 자세한 내용은 다음에서 확인할 수 있습니다. 공식 문서 쿼리 유형에 대해 설명합니다.
Couchbase에서 전체 텍스트 검색 색인 만들기
검색을 수행하려면 먼저 인덱스를 만들어야 합니다. 이 두 가지는 매우 다른 것이므로 N1QL 인덱스와 혼동해서는 안 됩니다.

카우치베이스 관리 대시보드에서 전체 텍스트 검색 색인을 만들 수 있습니다.
인덱스를 만들려면 이름을 지정하고 버킷을 할당해야 합니다. 매핑이 이루어져야 하므로 어떤 문서 속성이 JSON 문서 유형을 나타내는지 지정해야 합니다. 다음을 예로 들어보겠습니다:
|
1 2 3 4 5 |
{ "type": "사람", "이름": "Nic", "성": "라보이" } |
그리고 유형 속성은 분명히 이 특정 문서가 사람 문서.
JSON 유형이 문서 유형에 매핑된 경우 추가 매핑을 수행해야 합니다. 예를 들어 이 특정 인덱스의 용도가 사람 문서에 매핑해야 합니다. 새 유형 매핑을 생성하고 문서의 유형 속성입니다.
이제 필드를 색인하는 방법에 따라 모든 필드를 색인하거나 특정 속성만 색인하도록 선택할 수 있습니다. 특정 속성을 색인하려면 방금 만든 유형 매핑 아래에 새 하위 필드를 추가하면 됩니다.
특정 속성을 색인화하면 검색이 실행될 때 문서의 모든 필드가 아닌 해당 속성만 검색됩니다.
애플리케이션에 FTS 포함
인덱스가 생성되면 다양한 Couchbase Server SDK 중 하나를 사용하여 애플리케이션에 기능을 포함하려고 할 수 있습니다.
Node.js로 일치 쿼리를 수행한다고 가정해 보겠습니다. 코드는 다음과 같이 보일 수 있습니다:
|
1 2 3 4 5 |
var 검색 쿼리 = 카우치베이스.검색 쿼리; var 쿼리 = 검색 쿼리.new("index-name-here", 검색 쿼리.일치("검색-쿼리-여기")); 쿼리.필드(["FIELDS", "TO", "RETURN", "WITH", "PATH", "정의됨"]); 쿼리.하이라이트(검색 쿼리.하이라이트 스타일.HTML, "FIELD"); 버킷.쿼리(쿼리, 콜백); |
위의 예에서는 지정된 인덱스에 대해 새 쿼리가 만들어집니다. 검색어가 이 쿼리에 전달됩니다. 쿼리는 응답에 특정 필드를 포함하도록 추가로 사용자 지정할 수 있을 뿐만 아니라 검색 히트에 HTML 마크업이 포함되어 강조 표시되도록 할 수도 있습니다.
Java에서도 다음 코드를 사용하여 동일한 작업을 수행할 수 있습니다:
|
1 2 3 4 |
매치 쿼리 fts = 검색 쿼리.일치("검색-쿼리-여기"); 검색 쿼리 쿼리 = new 검색 쿼리("index-name-here", fts); 쿼리.필드("FIELDS", "TO", "RETURN"); 쿼리.하이라이트(하이라이트 스타일.HTML, "FIELD"); |
서로 다른 두 언어의 유사점이 눈에 띄나요? SDK 간의 API는 유사하게 설계되어 있으며, 예를 들어 퍼지 값을 추가하는 등 쉽게 확장할 수 있습니다.
결론
전체 텍스트 검색(FTS)은 Couchbase Server 5.0 이상의 놀라운 기능입니다. 이 기능을 사용하면 N1QL 쿼리에 와일드카드 문자를 여러 개 추가하는 것보다 매우 효율적이고 자연스럽게 검색할 수 있습니다.
FTS에 대한 자세한 내용은 다음을 참조하세요. 카우치베이스 개발자 포털.