카우치베이스 모바일 2.0은 JSON 문서에 강력한 전체 텍스트 검색(FTS) 기능을 도입합니다. 이는 다음을 기반으로 하는 새로운 쿼리 인터페이스의 일부입니다. N1QL는 JSON용 SQL을 확장하는 Couchbase의 선언적 쿼리 언어입니다. SQL에 익숙하다면 새로운 API의 의미를 쉽게 이해할 수 있을 것입니다.
전체 텍스트 검색을 사용하면 자연스러운 언어 쿼리가 가능합니다. 이 글은 Couchbase Lite의 쿼리 인터페이스에 대해 설명하는 시리즈 글 중 세 번째 글입니다. 이 블로그에서는 기본 사항을 잘 알고 있다고 가정하므로, 아직 기본 사항을 숙지하지 않은 경우 이전 게시물 를 먼저 읽어 보세요. 관심이 있으시다면 이 글의 끝에 쿼리 인터페이스의 다른 기능에 대해 설명하는 블로그 링크가 제공됩니다.
다음에서 최신 Couchbase Mobile 2.0 시험버전을 다운로드할 수 있습니다. 여기.
배경
1.x 버전의 Couchbase Mobile을 사용 중이라면 다음과 같은 내용을 잘 알고 계실 것입니다. 맵 보기 를 사용하여 인덱스와 쿼리를 만들 수 있습니다. 2.0에서는 더 이상 뷰와 맵 함수를 만들 필요가 없습니다! 대신, 간단한 인터페이스를 통해 인덱스를 생성하고 쿼리 빌더 인터페이스를 사용해 쿼리를 구성할 수 있습니다. 새로운 쿼리 인터페이스는 사용하기 더 간단하고 훨씬 더 강력합니다. 이 글에서 몇 가지 기능을 살펴보겠습니다.
샘플 프로젝트
여기서 설명하는 예제에서는 iOS용 Swift를 사용하지만, 몇 가지 사소한 차이점을 제외하면 동일한 쿼리 인터페이스가 Android 및 Windows 플랫폼에서도 지원된다는 점에 유의하세요.
따라서 약간의 수정만 하면 다른 플랫폼에서 작업할 때 이 글의 쿼리 예제를 재사용할 수 있습니다.
샘플 Swift 프로젝트에 관심이 있다면 아래 지침을 따르세요.
- GitHub에서 iOS Swift 플레이그라운드 복제하기
1$ git 복제 https://github.com/couchbaselabs/couchbase-lite-ios-api-playground - 해당 항목의 설치 지침을 따르세요. README 파일을 사용하여 플레이그라운드를 빌드하고 실행합니다.
샘플 데이터 모델
당사는 다음 위치의 여행 샘플 데이터베이스를 사용합니다. 여기. 이 사전 구축된 데이터베이스를 모바일 애플리케이션에 임베드하여 쿼리에 사용할 수 있습니다.
샘플 데이터 세트에는 다음과 같이 여러 유형의 문서가 포함되어 있습니다. 유형
속성을 추가합니다. 다음과 같은 문서에 초점을 맞출 것입니다. 유형
"랜드마크" . JSON 문서 모델은 아래와 같습니다. 간결성을 위해 아래 모델에서 이 게시물과 관련이 없는 일부 속성은 생략했습니다.
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 26 |
{ "활동": "참조", "주소": "클로드 모네 거리 84번지", "alt": "클로드 모네 재단", "city": "지베르니", "content": "이 집은 조용히 기이하고 동양의 영향을 받은 스타일로 매우 흥미로우며 모네의 [http://www.intermonet.com/japan/ 일본 판화] 컬렉션을 포함하고 있습니다. 이 사이트에는 모네의 원본 그림이 없습니다 - 진짜 매력은 집 주변의 정원입니다 ...", "country": "프랑스", "방향": null, "이메일": null, "geo": { "정확도": "ROOFTOP", "lat": 49.0753489, "lon": 1.5337884 }, "시간": "4월~10월 월~수 9:30~18:00 영업", "id": 10061, "이미지": null, "name": "모네의 집", "전화": "+33 232512821", "가격": "€9, $5 학생, €4 4.00 장애인, 7세 미만 무료", "state": "오트 노르망디", "title": "지베르니", "무료": null, "type": "랜드마크", "url": "http://www.fondation-monet.com/" } |
** 아래의 각 쿼리 예제는 위의 모델을 참조하세요. **
데이터베이스 핸들
아래 쿼리에서는 다음과 같이 데이터베이스
API를 사용하여 CouchbaseLite 데이터베이스를 열거나 생성합니다.
1 2 |
var 옵션 = 데이터베이스 구성() let db = 시도 데이터베이스(이름: kDBName, 구성: 옵션) |
기본 사항
전체 텍스트 검색을 통해 자연스러운 언어 쿼리가 가능합니다. 저희의 게시물에서 쿼리 기본 사항에 대해 논의했습니다. 같은 그리고 정규식 표현식을 사용하여 패턴 일치 작업을 수행할 수 있습니다. FTS는 다음을 지원하여 해당 기능을 대체합니다. 스템밍, 관련성 기반 순위 그리고 로캘별 자연어 쿼리.
전체 텍스트 검색은 다음과 같습니다. 대소문자 구분 없음 를 사용하여 일치
쿼리 표현식을 사용합니다. FTS를 수행하려면 다음을 만들어야 합니다. 전체 텍스트 색인 를 적절한 속성에 추가합니다. 하나 이상의 속성에 인덱스를 만들 수 있습니다.
스템밍
예제를 진행하기 전에 먼저 어간 축약에 대해 한 마디 하겠습니다. 어간화란 단어를 어근 어간으로 축소하는 과정을 말합니다. 따라서 인스턴스, "catty", "catlike", "cats"는 "고양이"라는 단어로 축소됩니다. 따라서 '고양이'라는 용어를 검색하면 '고양이', '고양이 같은' 등과 일치하는 결과를 얻을 수 있습니다.
카우치베이스 라이트는 현재 다음 언어의 스템밍을 지원합니다.
* 덴마크어
* 네덜란드어
* 영어
* 핀란드어
* 프랑스어
* 독일어
* 헝가리어
* 이탈리아어
* 노르웨이어
* 포르투갈어
* 로마자
* 러시아어
* 스페인어
* 스웨덴어
* 터키어
특정 언어가 사용되지 않는 경우에도 토큰화 도구는 텍스트를 유니코드 공백 문자로 단어로 분할합니다. 따라서 단어 사이에 공백을 넣는 모든 언어에서 잘 작동하지만 덜 잘 작동합니다.
전체 텍스트 색인
그리고 이름
를 생성할 때 인덱스와 연관된 이름을 지정하는 것이 중요합니다. 나중에 보게 될 쿼리 예제에서는 이름을 통해 적절한 인덱스를 참조합니다.
단일 속성 색인
다음 예제에서는 전체 텍스트 인덱스
에서 "content" 속성의 문서
. 스템밍은 기본적으로 활성화되어 있으며 로캘은 디바이스의 로캘로 가정합니다. 아래에는 표시되지 않았지만, '악센트'를 무시할지 여부를 지정하는 옵션도 있습니다. 무시 악센트
옵션을 설정합니다. 기본적으로 악센트는 무시되지 않습니다.
1 2 |
let ftsIndex = 인덱스 빌더.전체 텍스트 인덱스(항목: 풀텍스트 인덱스 항목.속성("content")) 시도 db.createIndex(ftsIndex,withName: "ContentFTSIndex") |
다중 속성 색인
다음 예제에서는 전체 텍스트 인덱스
on "content" 그리고 "name" 속성의 문서
1 2 |
let ftsIndex = 인덱스 빌더.전체 텍스트 인덱스(항목: 풀텍스트 인덱스 항목.속성("content"),풀텍스트 인덱스 항목.속성("name")) 시도 db.createIndex(ftsIndex,withName: "ContentAndNameFTSIndex") |
줄임말 없이 색인 생성
다음 예제에서는 전체 텍스트 인덱스
에서 "content" 속성의 문서
를 비활성화한 상태입니다. 기본적으로 현재 디바이스 언어 설정을 사용하여 형태소 분석이 활성화됩니다. 언어를 nil로 설정하면 형태소 분석이 비활성화됩니다.
1 2 |
let ftsIndex = 인덱스 빌더.전체 텍스트 인덱스(항목: 풀텍스트 인덱스 항목.속성("content")).언어(nil) 시도 db.createIndex(ftsIndex,withName: "ContentFTSIndexNoStemming") |
스템밍을 사용한 FTS 검색
아래 쿼리는 id 그리고 콘텐츠 속성의 "랜드마크" 유형
용어가 포함된 문서 "기계" 에서 "content" 속성입니다. 우리는 "ContentFTSIndex" 를 만들었습니다.
요청
1 2 3 4 5 6 7 8 9 |
let ftsExpression = 풀텍스트 표현식.색인("ContentFTSIndex") let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디( 표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("기계"))) .limit(표현식.int(limit)) |
샘플 응답
위의 쿼리에 대한 응답에는 "기계", "메커니즘", "메커니즘", "기계공" 등의 용어가 포함된 문서가 포함됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[ { "id": "landmark_21703", "content": "1851년에 설립된 스위스 명품 시계 제조업체는 정밀한 기계 장치로 유명합니다." }, { "id": "landmark_2592", "content": "샌프란시스코의 유명한 케이블카를 움직이는 메커니즘은 물론 케이블카 기념품과 케이블카의 역사에 대한 정보를 많이 볼 수 있어요." }, { "id": "landmark_26144", "content": "골든 게이트 국립 휴양지의 이 경치 좋은 구간은 험준한 해안 고지대와 깊은 모래 언덕이 있어 등산객, 자전거 타는 사람, 해변을 찾는 사람들이 즐겨 찾는 곳이에요. 행글라이딩은 이곳에서 꽤 인기가 있으며 행글라이더를 판매하는 상점도 여러 곳 있습니다. 인근에는 2차 세계대전 당시 군사 방어 시설인 데이비스 포대가 남아 있습니다." }, { "id": "landmark_33234", "content": "웨스턴 스타일의 스테이크 하우스에는 거대한 '컨트리' 바가 있고, 가짜 황소 타기 모험을 즐길 준비가 된 분들을 위한 기계식 황소도 있습니다. 메뉴가 방대하고 놀라울 정도로 저렴해요. 그리고 이 살롱은 선셋 스트립에서 시끌벅적하고 즐거운 시간을 보낼 수 있는 오랜 트렌디한 장소입니다." } ] |
FTS 검색 없이 스템밍
아래 쿼리는 id 그리고 콘텐츠 속성의 "랜드마크" 유형
정확한 용어가 포함된 문서 "기계" 에서 "content" 속성입니다. 우리는 "ContentFTSIndexNoStemming" 를 생성하여 스템밍을 비활성화하는 옵션을 지정했습니다.
요청
1 2 3 4 5 6 7 8 |
let ftsExpression = 풀텍스트 표현식.색인("ContentFTSIndexNoStemming") let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("기계"))) .limit(표현식.int(limit)) |
샘플 응답
위의 쿼리에 대한 응답에는 "기계적"이라는 용어가 정확히 포함된 문서가 포함됩니다. 모든 검색은 대소문자를 구분하지 않는다는 점에 다시 한 번 유의하세요.
1 2 3 4 5 6 7 |
[ { "id": "landmark_33234", "content": "웨스턴 스타일의 스테이크 하우스에는 거대한 '컨트리' 바가 있고, 가짜 황소 타기 모험을 즐길 준비가 된 분들을 위한 기계식 황소도 있습니다. 메뉴가 방대하고 놀라울 정도로 저렴해요. 그리고 이 살롱은 선셋 스트립에서 시끌벅적하고 즐거운 시간을 보낼 수 있는 오랜 트렌디한 장소입니다." } ] |
여러 속성에서 FTS 검색
아래 쿼리는 id , 이름 그리고 콘텐츠 속성의 "랜드마크" 유형
용어가 포함된 문서 "기계" 중 하나에서 "name" 또는 "content" 속성입니다. 우리는 "ContentAndNameFTSIndex" 를 생성했습니다. 이 인덱스를 사용하면 "name" 그리고 "content" 속성
요청
1 2 3 4 5 6 7 8 9 |
let ftsExpression = 풀텍스트 표현식.색인("ContentAndNameFTSIndex") let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("name")), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("기계"))) .limit(표현식.int(limit)) |
샘플 응답
위 쿼리에 대한 응답에는 '이름' 또는 '콘텐츠' 속성 중 하나에 '기계적'(또는 어간을 통해 파생된 변형)이라는 용어가 포함된 문서가 포함됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[ { "id": "landmark_10062", "name": "자연 기계 박물관", "content": "길레마드 형제가 설립했습니다: 장 피에르, 르네, 제라르는 현재 패트리모니 보존에 시간과 노하우를 바친 애호가 팀의 도움을 받아 복원 및 전시를 운영하고 있습니다. 박물관의 기원은 1955년 대대로 기베르니에 거주해온 기예마드 가문에 의해 설립된 증기 내연기관 개인 소장품입니다." }, { "id": "landmark_21703", "name": "파텍 필립 살롱", "content": "1851년에 설립된 스위스 명품 시계 제조업체는 정밀한 기계 장치로 유명합니다." }, { "id": "landmark_25929", "name": "케이블카 박물관", "content": "샌프란시스코의 유명한 케이블카를 움직이는 메커니즘은 물론 케이블카 기념품과 케이블카의 역사에 대한 정보를 많이 볼 수 있습니다." }, { "id": "landmark_26144", "name": "포트 펀스턴", "content": "골든 게이트 국립 휴양지의 이 경치 좋은 구간은 험준한 해안 고지대와 깊은 모래 언덕이 있어 등산객, 자전거 타는 사람, 해변을 찾는 사람들이 즐겨 찾는 곳이에요. 행글라이딩은 이곳에서 꽤 인기가 있으며 행글라이더를 판매하는 상점도 여러 곳 있습니다. 인근에는 2차 세계대전 당시 군사 방어 시설인 데이비스 포대의 잔해가 남아 있습니다." } ] |
논리 표현식을 사용한 FTS 검색
앞의 예제에서는 형태소 분석을 비활성화하면 정확한 검색 문자열을 찾을 수 있다는 것을 보았습니다. 하지만 두 개 이상의 검색어를 찾고 싶다면 어떻게 해야 할까요? 검색어 일치
쿼리 표현식은 AND 및 OR을 포함한 논리 표현식을 허용합니다.
아래 쿼리는 id 및 콘텐츠 속성의 "랜드마크" 유형
용어가 포함된 문서 "기계" 또는 "메커니즘" 에서 "content" 속성입니다. 우리는 "ContentFTSIndexNoStemming" 를 사용하여 스템밍을 비활성화할 수 있습니다.
요청
1 2 3 4 5 6 7 8 |
let ftsExpression = 풀텍스트 표현식.색인("ContentFTSIndexNoStemming") let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("기계 또는 메커니즘"))) .limit(표현식.int(limit)) |
샘플 응답
위의 쿼리에 대한 응답에는 '콘텐츠' 속성에 '기계적' 또는 '메커니즘'이라는 용어가 정확히 포함된 문서가 포함됩니다.
1 2 3 4 5 6 7 8 9 10 11 |
[ { "id": "landmark_26144", "content": "골든 게이트 국립 휴양지의 이 경치 좋은 구간은 험준한 해안 고지대와 깊은 모래 언덕이 있어 등산객, 자전거 타는 사람, 해변을 찾는 사람들이 즐겨 찾는 곳이에요. 행글라이딩은 이곳에서 꽤 인기가 있으며 행글라이더를 판매하는 상점도 여러 곳 있습니다. 인근에는 2차 세계대전 당시 군사 방어 시설인 데이비스 포대의 잔해가 남아 있습니다." }, { "id": "landmark_33234", "content": "웨스턴 스타일의 스테이크 하우스에는 거대한 '컨트리' 바가 있고, 가짜 황소 타기 모험을 즐길 준비가 된 분들을 위한 기계식 황소도 있습니다. 메뉴가 방대하고 놀라울 정도로 저렴해요. 그리고 이 살롱은 선셋 스트립에서 시끌벅적하고 즐거운 시간을 보낼 수 있는 오랜 트렌디한 장소입니다." } ] |
윌카드 표현식을 사용한 FTS 검색
검색 문자열에 "*" 문자를 사용하여 일치하는 문자가 0개 이상임을 나타낼 수 있습니다.
아래 쿼리는 id 및 콘텐츠 속성의 "랜드마크" 유형
용어가 포함된 문서 "walt*" 에서 "content" 속성을 입력합니다. 이렇게 하면 'walt'로 시작하여 0자 이상으로 끝나는 모든 검색어가 일치합니다. 여기서는 "ContentFTSIndex" 를 만들었습니다.
참고: 검색어에 와일드카드를 사용하는 것이 어간화를 구현하는 순진한 방법이라고 주장할 수도 있습니다. 하지만 그렇게 되면 어간을 통해 파생된 용어와 일치하지 않을 수 있는 파생 형태가 나올 수 있습니다. 따라서 필요한 경우에만 스템밍을 사용하는 것이 바람직합니다.
요청
1 2 3 4 5 6 7 8 |
let ftsExpression = 풀텍스트 표현식.색인("ContentFTSIndex") let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("walt*"))) .limit(표현식.int(limit)) |
샘플 응답
위 쿼리에 대한 응답에는 "walt", "Walter", "Waltham", "Walthamstow" 등의 용어가 포함된 문서가 포함됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[ { "id": "landmark_10134", "content": "아이브록스 투어에서는 홈 탈의실에 들어가 월터 스미스와 앨리 맥코이스트의 녹음 메시지를 듣고 대리석 계단을 올라가 유명한 트로피 룸, 블루룸, 매니저 사무실을 방문합니다. 셀틱과의 경기를 제외한 티켓은 클럽 웹사이트, 경기장 티켓 센터, 글래스고 시내 중심가에 있는 JJB 스포츠 매장의 클럽 아울렛에서 온라인으로 구매할 수 있습니다." }, { "id": "landmark_16104", "content": "월섬 포레스트의 역사를 소개합니다. 이 건물은 업무용 주택으로 지어졌으며 이후 경찰서와 개인 주택으로 사용되었습니다. 1892년 엔지니어 프레드릭 브레머가 영국에서 만든 최초의 가솔린 구동 자동차라고 주장하는 브레머 자동차가 컬렉션에 포함되어 있습니다." }, { "id": "landmark_16105", "content": "12세기 세인트 메리 교회를 중심으로 한 오늘날 월섬스토의 고대 중심지" }, { "id": "landmark_16574", "content": "인상적인 홀 건축물로 대부분의 날 투어가 진행되며, 도로시 챈들러 파빌리온은 크리스마스 이브 당일에 아마추어 문화 예술 단체의 공연이 거의 24시간 진행되며, 월트 디즈니 홀은 매일 투어가 진행되며, 일정은 웹사이트에서 확인하세요." }, { "id": "landmark_8631", "콘텐츠": "로버트 번스, 월터 스콧 경, 로버트 루이스 스티븐슨을 중심으로 한 스코틀랜드의 유명 작가에 관한 박물관 " } ] |
중지 단어를 사용한 FTS 검색
중지 단어는 한 언어의 일반적인 단어를 의미합니다. 영어에서는 "the", "is", "and" , "which" 등과 같은 용어가 이에 해당합니다.
예 1: 검색 문자열에 중지어가 포함된 경우
카우치베이스 라이트는 검색 문자열에 나타나는 중지 단어를 무시합니다.
아래 쿼리는 id 및 콘텐츠 속성의 "랜드마크" 유형
용어가 포함된 문서 "기록에" 에서 "content" 속성입니다. 우리는 "ContentFTSIndex" 를 만들었습니다.
카우치베이스 라이트는 중지 단어 "on"과 "the"를 무시하므로 "history"라는 용어와 어간 단어의 파생 형태만 포함된 문서를 가져올 수 있습니다.
요청
1 2 3 4 5 6 7 |
let ftsExpression = 풀텍스트 표현식.색인("ContentFTSIndex") let 검색 쿼리 = 쿼리 빌더.선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("기록에"))) .limit(표현식.int(limit)) |
샘플 응답
위 쿼리에 대한 응답에는 "역사"라는 용어와 이 단어의 파생 형태인 "역사적" 등의 용어가 포함된 문서가 포함됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[ { "id": "landmark_10019", "content": "군사 공학과 대영제국의 역사에 관한 박물관입니다. 관람하는 데 반나절 정도 걸리는 꽤 방대한 컬렉션입니다. 영국과 군사 역사 또는 토목 공학 팬들이 가장 관심을 가질 만한 곳입니다." }, { "id": "landmark_10083", "content": " 투어는 약 45분 정도 소요됩니다. 건물 앞에 있는 도시의 개념적 중심지인 조지 광장에는 시민 지도자와 역사 속 유명 인사들의 동상이 여러 개 세워져 있으며 야외 행사에도 자주 이용됩니다." }, { "id": "landmark_10093", "content": "이 강당은 이제 역사상 가장 많이 다운로드된 YouTube 동영상 클립 중 하나인 수잔 보일 오디션이 촬영된 장소로 세계적으로 명성을 얻고 있습니다." }, { "id": "landmark_10101", "content": "이 박물관에는 도시의 역사를 보여주는 많은 유물과 전시물이 있습니다. 박물관 자체에 입장료를 내고 싶지 않다면 (3개의 개별 박물관이 있는) 건물 안으로 들어가서 아트리움 벽에 걸린 역사적인 사진들을 볼 수 있어요." }, { "id": "landmark_10105", "content": "피플스 팰리스는 글래스고와 글래스고 사람들의 역사를 다양한 관점에서 보여주는 훌륭한 민속 박물관으로, 글래스고 생활의 세부 사항(빌리 코놀리의 바나나 부츠 중 하나 포함)을 전시하고 있어요. 근처에 있는 윈터 가든은 합리적인 가격의 카페가 있는 쾌적한 온실입니다.") } ] |
예 2: 검색 중 중지 단어 무시하기
기본적으로 카우치베이스 라이트는 검색 콘텐츠 내의 중지 단어를 무시합니다.
아래 쿼리는 id 및 콘텐츠 속성의 "랜드마크" 유형
약관이 포함된 문서 "파란 지느러미 노란 지느러미" 에서 "content" 속성입니다. 우리는 "ContentFTSIndex" 를 만들었습니다.
카우치베이스 라이트는 검색 시 중지어를 무시하므로 '파란색', '지느러미', '노란색'이라는 용어가 포함된 문서를 중지어로 구분된 순서대로 가져올 수 있습니다.
요청
1 2 3 4 5 6 7 |
let ftsExpression = 풀텍스트 표현식.색인("ContentFTSIndex") let 검색 쿼리 = 쿼리 빌더.선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("파란 지느러미 노란 지느러미"))) .limit(표현식.int(limit))<코드 클래스="swift"> |
샘플 응답
위 쿼리에 대한 응답에는 "파란색", "지느러미", "노란색"이라는 용어가 "파란색 지느러미, 노란색 지느러미"와 같이 원하는 수의 쉼표로 구분된 문서가 포함됩니다.
1 2 3 4 5 6 7 |
[ { "id": "landmark_18840", "content": "이 대형 수족관은 전형적인 현지 서식지 전시를 통해 지역 해양 생물을 전문적으로 전시하는 곳으로, 화려한 전시물이 많아요. 특히 여러 종류의 거대한 다시마와 다양한 해양 동물 종으로 가득한 3층 높이의 켈프 숲 전시관과 대형 참다랑어와 황다랑어, 마히마히, 상어(가끔씩 바다로 방류되기 전에 일시적으로 방문하는 백상아리 포함), 바다 개복치(몰라몰라), 바다거북이 있는 백만 갤런 규모의 오픈 씨 전시관이 유명해요. 최고의 전시물로는 머리 위를 헤엄치는 은색 정어리가 있는 대형 수조와 야생으로 돌아갈 수 없다고 판단되어 수족관에 보관 중인 구조된 해달 중 한 마리가 있습니다. )" } ] |
순위가 있는 FTS 검색
다음을 사용할 수 있습니다. 풀텍스트 함수 순위
을 클릭하여 검색 결과의 순위 순서를 지정할 수 있습니다. 가장 일치하는 순서대로 일치하는 항목을 평가하는 데 유용합니다.
아래 쿼리는 id 및 콘텐츠 속성의 "랜드마크" 유형
용어가 포함된 문서 "유치" 에서 "content" 속성으로 설정합니다. 문서는 순위에 따라 내림차순으로 정렬되므로 일치 항목 수가 가장 많은 문서가 나머지 문서보다 높게 정렬됩니다.
요청
1 2 3 4 5 6 7 8 |
let ftsExpression = 풀텍스트 표현식.색인("ContentFTSIndexNoStemming") let 검색 쿼리 = 쿼리 빌더.선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("content"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("랜드마크")) .그리고( ftsExpression.일치("유치"))) .주문 기준(주문하기.표현식(전체 텍스트 함수.순위("ContentFTSIndexNoStemming")).내림차순()) .limit(표현식.int(limit)) |
샘플 응답
위 쿼리에 대한 응답에는 다음과 같은 용어가 포함된 문서가 포함됩니다. "유치" 또는 파생된 버전입니다. 최대 일치 문서 수가 많은 문서가 더 높게 정렬됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[ { "id": "landmark_22056", "content": "농장, 실내 빈티지 유원지, 동물원, 실내외 모험 놀이를 포함한 웨일즈 최고의 유료 방문객 명소입니다. 50%의 어트랙션이 숨겨져 있는 전천후 가족 명소입니다." }, { "id": "landmark_16309", "content": "런던 브리지 익스피리언스와 런던 툼스는 하나의 가격으로 즐길 수 있는 두 가지 공포 명소로, 3년 연속 영국 최고의 연중 공포 명소로 선정되었습니다." }, { "id": "landmark_25216", "content": "미션 비치의 남쪽 끝에 위치한 해변 놀이공원인 벨몬트 파크는 여러 상점, 레스토랑, 아케이드, 놀이기구가 있는 랜드마크입니다. 가장 큰 매력은 역사적인 롤러코스터인 자이언트 디퍼로, 서부 해안에서 아직 운영 중인 유일한 두 개의 해안가 롤러코스터 중 하나입니다. 다른 놀이기구 중에는 플로우라이더(바디보드를 탈 수 있는 시뮬레이션 파도 어트랙션), 앤티크 회전목마, 범퍼카, 슬라이드, 진자 놀이기구, 틸트어월, 트램펄린 등이 있습니다." }, { "id": "landmark_1059", "content": "20세기 비행의 역사를 소개하는 것을 목표로 하며 영국항공 콩코드 G-BOAA를 비롯한 다양한 항공기 컬렉션을 보유하고 있습니다. 세계 최초의 제트 여객기에서 파생된 드하빌랜드 코멧 4C도 볼 만한 가치가 있는 또 다른 명소입니다." } ] |
제한 사항
Couchbase Lite 2.0의 FTS 기능은 매우 강력하며 임베디드 데이터베이스의 일반적인 사용 사례에 충분하지만, 몇 가지 제한 사항이 있습니다.
- 일치 표현식은 최상위 또는 최상위 AND 표현식에만 사용할 수 있습니다. 즉, 다음과 같은 표현식은 허용되지 않습니다. ftsExpression.match("attract").or(ftsExpression2.match("museum"))
- 사용자 지정 언어 토큰화 도구
지원되는 언어 목록은 앞서 지정되었습니다. 이 글을 작성하는 현재로서는 다른 언어로 지원을 확장하기 위해 사용자 지정 토큰화 도구를 연결할 수 없습니다. - 퍼지 검색 지원
쿼리에 '퍼지' 요소를 지정하면 관련성이 낮은 일치 항목이 고려될 수 있습니다. - 패싯
패싯 검색은 지원되지 않습니다.
카우치베이스 라이트는 임베디드 데이터베이스라는 점을 명심하세요. 따라서 FTS 기능이 서버 측 데이터베이스 구현만큼 광범위할 필요는 없다고 주장할 수도 있습니다. 이에 대한 지원은 향후 릴리스에서 평가될 예정입니다.
다음 단계
이 블로그 게시물에서는 Couchbase Mobile 2.0의 새로운 쿼리 API에서 전체 텍스트 검색(FTS) 기능을 활용하는 방법에 대해 살펴보았습니다. 이것은 시작에 불과합니다. 향후 릴리스에서 더 많은 기능이 추가될 예정입니다. 최신 릴리스는 다음에서 다운로드할 수 있습니다. 다운로드 페이지로 이동합니다.
다음은 관심을 가질 만한 몇 가지 다른 Couchbase 모바일 쿼리 관련 게시물입니다.
- 이 블로그 게시물 기본 사항에 대해 설명합니다.
- 이 블로그 게시물 배열 컬렉션을 쿼리하는 방법에 대해 설명합니다.
- 이 블로그 게시물 조인 쿼리를 수행하는 방법에 대해 설명합니다.
질문이나 피드백이 있으면 아래에 댓글을 남기거나 트위터로 언제든지 문의해 주세요. @rajagp 또는 이메일을 보내주세요. priya.rajagopal@couchbase.com. . 카우치베이스 포럼 를 통해 질문할 수 있습니다.