Couchbase FTS는 새로운 전체 텍스트 인덱스 및 쿼리 엔진입니다. 작년에 소개해 드린 바 있습니다. 이 게시물 및 참조 문서 를 참조하여 어떤 기능을 사용할 수 있는지 알아보세요.
이번 카우치베이스 개발자 릴리스에서 FTS의 새로운 기능을 소개합니다.
유형 매핑
과거에는 유형 매핑을 선언하는 방법이 한 가지뿐이었는데, 문서 유형을 구분하는 데 사용할 필드(기본값은 '유형' 필드)를 FTS에 알려주는 것이었습니다. 모든 문서에 공통 필드를 유형 선택기로 사용하는 것이 유용하고 일반적인 방법이지만, 이것이 유일한 방법은 아닙니다. 그래서 문서 간에 유형을 구분하는 다른 방법을 추가했습니다.
- 구분 기호까지의 문서 ID: 유형 식별자는 문서 키의 접두사이며, 지정된 문자까지 포함하되 포함하지 않습니다.
- 정규식을 사용한 문서 ID: 고급 사용자의 경우 유형 식별자와 일치하는 정규식을 지정할 수 있습니다.
이것이 여행 샘플에 어떻게 적용되나요? 모든 문서 키의 패턴은 동일합니다. 다음은 몇 가지 예입니다:
항공사_10, 항공사_10748, 호텔_6445, 호텔_9905, 랜드마크_10019, 랜드마크_9838, 노선_10009, 노선_14273, 노선_9807
보시다시피 모두 밑줄, 숫자보다 유형, 밑줄보다 숫자로 시작합니다. 밑줄을 구분 기호로 사용하면 모두 밑줄과 숫자보다 유형이 문자열로 시작됩니다. 따라서 옵션을 '_'로 설정하여 DOC ID를 구분 기호까지 사용할 수 있습니다. 이는 문서의 유형이 포함된 필드가 'type'이라고 말하는 것과 동일합니다. 이것이 바로 우리가 사용하는 방식입니다.
이제 여기서 또 다른 패턴을 식별할 수 있습니다. 모든 DOC ID는 밑줄 문자까지 소문자로 시작합니다. 길이는 5자에서 8자 사이입니다. 숫자보다 더 많습니다. 이 관찰을 다음 정규식으로 변환할 수 있습니다: ^[a-z]{5,8}
이 표현식은 문자열의 시작 부분(^ 덕분에)과 길이가 5에서 8 사이({5,8} 덕분에)인 'a'와 'z' 사이의 모든 문자([a-z] 덕분에)를 일치시킵니다.
따라서 다음과 같이 옵션을 설정하여 정규식이 포함된 문서 ID 옵션을 사용할 수 있습니다. ^[a-z]{5,8}. 정규식은 때때로 복잡하지만 고급 필터링을 수행할 수 있습니다.
정렬
이번 릴리즈의 또 다른 새로운 기능은 정렬입니다. 이전 버전에서도 정렬 기능을 사용할 수 있었다고 생각하실 것입니다. 그 말이 맞습니다. 검색과 일치하는 모든 문서에는 관련성 점수가 있으며 결과는 항상 내림차순 점수에 따라 정렬됩니다. 하지만 이제 사용자가 직접 정렬 순서를 지정할 수 있습니다. FTS 쿼리에 다음과 같이 작동하는 정렬 필드를 추가했습니다:
"sort" : [ "국가", "주", "도시", "-score" ]
여기서 결과는 국가, 주, 도시가 비슷한 경우 주와 도시보다 국가를 먼저 정렬합니다. 그런 다음 모두 동일한 경우 점수 내림차순으로 정렬됩니다. 정렬 필드 앞에 '-' 문자를 붙여 내림차순으로 정렬합니다. 또한 정렬 배열의 모든 필드가 인덱스에 저장되어 있는지 확인해야 합니다. 이것이 전체 FTS 쿼리의 모습입니다:
{ "설명": false, "필드": [ "title" ], "highlight": {}, "sort": ["국가", "주", "도시", "-score", "-_id"], "query":{ "쿼리": "아름다운 수영장" } }
Java를 사용하는 경우, 예를 들어 여행 샘플 앱 예를 들어 사용자 지정 정렬을 쉽게 추가할 수 있습니다. 호텔 서비스를 열고 findHotels 메서드로 이동하기만 하면 됩니다. 다음과 같이 보일 것입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
연결 쿼리 fts = 검색 쿼리.접속사(검색 쿼리.용어("호텔").필드("type")); 만약 (위치 != null && !위치.isEmpty() && !"*".같음(위치)) { fts.그리고(검색 쿼리.분리( 검색 쿼리.matchPhrase(위치).필드("country"), 검색 쿼리.matchPhrase(위치).필드("city"), 검색 쿼리.matchPhrase(위치).필드("state"), 검색 쿼리.matchPhrase(위치).필드("주소") )); } 만약 (설명 != null && !설명.isEmpty() && !"*".같음(설명)) { fts.그리고( 검색 쿼리.분리( 검색 쿼리.matchPhrase(설명).필드("설명"), 검색 쿼리.matchPhrase(설명).필드("name") )); } 검색 쿼리 쿼리 = new 검색 쿼리("hotels", fts) .limit(100); 로그 쿼리(쿼리.내보내기().toString()); 검색 쿼리 결과 결과 = 버킷.쿼리(쿼리); |
실행할 쿼리는 기본적으로 이 코드 줄입니다: 검색 쿼리 쿼리 = 새 검색 쿼리("hotels", fts).limit(100);
그리고 정렬 메서드에 호출을 추가하기만 하면 됩니다: 검색 쿼리 쿼리 = 새 검색 쿼리("hotels", fts).limit(100).sort("국가", "주", "도시", "-score")
고급 옵션도 사용할 수 있습니다.
백엔드
변경되었지만 최종 사용자에게는 보이지 않는 것은 FTS 인덱스 백엔드를 변경했다는 점입니다. ForestDB를 사용하던 것에서 Mossmoss는 간단하고 빠르며 정렬되고 지속 가능한 golang용 키 값 저장 라이브러리로, "메모리 지향 정렬 세그먼트"의 약자입니다. 다음은 README에서 가져온 기능 목록입니다:
- 정렬된 키-값 수집 API
- 100% 이동 구현
- 키 범위 반복기
- 스냅샷은 격리된 읽기를 제공합니다.
- 배치 API를 통한 원자 변이
- 병합 작업을 통해 쓰기 작업이 많은 사용 사례(예: 카운터 업데이트)에 대한 읽기-계산-쓰기 최적화가 가능합니다.
- 동시 독자와 작성자는 서로를 차단하지 않습니다.
- 추가 메모리 복사를 피하기 위한 선택적 고급 API
- 쓰기에는 추가 전용 디자인을 사용하고 읽기에는 구성 가능한 압축 정책과 함께 mmap()을 사용하는 선택적 하위 수준 스토리지 구현인 "mossStore"를 참조하세요: OpenStoreCollection()
- mossStore는 읽기 전용 방식으로 이전 커밋 지점을 다시 탐색하고 이전 커밋 지점으로 되돌릴 수 있도록 지원합니다.
- 고급 사용자가 제공하고자 하는 하위 수준의 스토리지 구현에 쓰기-백 캐싱을 허용하는 선택적 지속성 후크(예: leveldb, sqlite 등에 이끼를 연결할 수 있음).
- 이벤트 콜백을 통해 비동기 작업을 모니터링할 수 있습니다.
- 단위 테스트
- GO-FUZZ & SMAT을 통한 퍼즈 테스트(github.com/mschoch/smat); 참조 README-smat.md
상당히 낮은 수준이기 때문에 자세히 설명하지는 않겠습니다. 하지만 이와 같은 낮은 수준의 아키텍처에 대해 더 많은 정보를 원하신다면 알려주시면 감사하겠습니다. 모스나 Couchbase Server의 다른 구성 요소에 대해 더 자세히 알아보고 싶으신가요? 그렇다면 트위터나 아래 댓글을 통해 알려주세요.