전체 텍스트 검색(또는 FTS) 는 Couchbase 4.5에서 개발자 프리뷰로 출시되는 새로운 기능입니다. 프로덕션용이 아니며 아직 지원되지 않지만 앞으로의 기능을 미리 엿볼 수 있습니다.
검색 기능을 제공할 때는 간단한 '%foo%' 처럼 와 함께 N1QL 만으로는 충분하지 않습니다. 사용자는 언어를 인식하고 관련성에 따라 검색 결과의 순위를 매기는 보다 풍부한 검색 환경을 기대합니다.
이 블로그 게시물에서는 이를 보여드리겠습니다:
- 전체 텍스트 검색 색인을 설정하는 방법
- 전체 텍스트 검색 쿼리를 실행하는 방법 카우치베이스 콘솔
- ASP.NET에서 강조 표시를 사용하여 전체 텍스트 검색 쿼리를 실행하는 방법
전체 텍스트 검색 색인 설정
먼저 다음을 사용하고 있는지 확인해야 합니다. Couchbase 4.5(베타 버전 이상)를 클릭하여 Couchbase 콘솔에 액세스할 수 있고 클러스터가 전체 텍스트 서비스를 실행 중인지 확인합니다. 전체 텍스트 서비스가 실행 중인지 여부는 Couchbase 콘솔에서 "서버 노드"를 클릭하여 확인할 수 있습니다. 클러스터에 노드를 추가할 때 전체 텍스트와 같은 서비스를 활성화/비활성화해야 합니다. 다시 한 번 복습이 필요한 경우 내 윈도우에 카우치베이스 설치 및 설정 방법에 대한 블로그 게시물.

전체 텍스트 검색 색인을 설정하려고 합니다. 여행 샘플 샘플 데이터 버킷이 필요합니다. 설정 -> 샘플 버킷으로 이동하여 '여행 샘플'을 선택한 다음 "만들기"를 클릭하여 설치할 수 있습니다.

이 샘플 데이터에는 '랜드마크' 유형의 문서가 있습니다. 무엇보다도 이 문서에는 '콘텐츠' 필드가 포함되어 있습니다. 다음은 랜드마크 문서 중 하나의 스니펫입니다. (따라가시는 경우 ID 'landmark_16079'입니다):
|
1 2 3 4 5 6 7 |
{ "title": "런던/시티 오브 런던", "name": "20 펜처치 스트리트", "content": "특이한 "워키 토키"라파엘 비놀리가 건설 중인 이 초고층 빌딩의 프로필이 헤드라인을 장식했습니다.", "type": "랜드마크" } |
이 구조를 염두에 두고 색인을 만들어 보겠습니다. 색인->전체 텍스트로 이동하여 "새 전체 텍스트 색인"을 클릭합니다.
인덱스의 이름을 지정하겠습니다. travel-sample-idx를 클릭하고 여행 샘플 버킷을 추가합니다. 여기에는 많은 옵션이 있지만 여기서는 유형 매핑에 대해서만 다루겠습니다. "유형 매핑"을 확장하고 "유형 매핑 추가"를 클릭합니다. 이렇게 하면 전체 텍스트 검색을 특정 유형의 문서(이 경우 '유형' 필드와 일치하는 '랜드마크')로 제한할 수 있습니다. 또한 "지정된 필드만 색인" 상자를 선택하면 문서의 모든 필드가 검색을 위해 색인됩니다. "확인"을 누릅니다.

그런 다음 '랜드마크' 유형 매핑 위에 마우스를 가져간 다음 + 기호를 클릭하고 '하위 필드 삽입'을 클릭합니다. 문서 계층 구조에서 더 아래에 있는 검색 데이터의 색인을 생성하려면 필요한 만큼의 레벨까지 '하위 매핑 삽입'을 수행해야 합니다. 저희의 경우 콘텐츠 필드는 루트 레벨에 있으므로 그렇게 할 필요가 없습니다.
하위 필드의 경우 필드에 필드 이름("콘텐츠")을 입력하고 다른 항목은 그대로 둔 채 "저장" 확인란(나중에 자세히 설명)을 선택한 후 "확인"을 누릅니다.

마지막으로 '기본' 유형 매핑을 편집하고 '사용' 옵션을 선택 취소합니다. 이 매핑을 사용하면 모든 문서에서 검색이 가능하지만 이 예에서는 랜드마크로만 제한하려고 합니다. "확인"을 누르고 "색인 만들기"를 누릅니다.

"색인 생성"을 누르면 방금 생성한 색인의 개요가 표시됩니다. 즉시 문서 색인 생성이 시작됩니다. 색인 생성 후 새로 고침 버튼을 누르면 지금까지 색인된 문서의 수가 표시됩니다.

완료되면 100%가 됩니다.

Couchbase 콘솔에서 전체 텍스트 검색 쿼리를 실행합니다.
C#/.NET으로 들어가기 전에 콘솔에서 바로 전체 텍스트 검색을 시도해 볼 수 있습니다. 색인->전체 텍스트로 이동하여 방금 만든 전체 텍스트 색인을 선택합니다. 검색어를 입력합니다(여행 샘플을 사용하는 경우 '여관', '초고층 빌딩' 또는 '민박'이 좋은 용어입니다.

검색을 클릭하면 관련성 점수 순으로 검색 결과 페이지(문서 ID 및 콘텐츠 조각)가 표시됩니다. 콘텐츠 조각에서 검색어가 강조 표시되어 있는 것을 확인할 수 있습니다. 하위 필드에서 '저장'을 활성화하면 이 기능이 작동합니다. 저장을 활성화하지 않으면 여전히 관련성 있는 순서대로 문서 결과가 표시되지만 강조 표시된 콘텐츠 조각은 표시되지 않습니다.

전체 텍스트 검색은 Bleve를 사용하여 더 복잡한 검색(정확한 구문, 부울 쿼리 등)을 할 수 있습니다. 검색해 보기 "침대와 아침 식사" 또는 침대 - 조식를 클릭하고 어떤 일이 발생하는지 확인하세요.
ASP.NET에서 강조 표시가 포함된 전체 텍스트 검색 쿼리
생성한 전체 텍스트 검색 인덱스가 만족스러우면 이제 Couchbase 콘솔에서 실제 애플리케이션으로 가져올 차례입니다. 저는 Couchbase .NET SDK를 사용하여 전체 텍스트 검색을 수행하는 방법을 보여주는 예제를 ASP.NET으로 만들었습니다. 이 예제에서는 ASP.NET MVC에 익숙하고 ASP.NET과 Couchbase를 통합하는 기본 사항에 대해 잘 알고 있다고 가정합니다. 그렇지 않은 경우에는 이전에 블로그에 소개했던 ASP.NET "Hello World" 예제.
두 가지 작업을 만들었습니다: 색인 및 검색입니다. Index 액션은 사용자가 검색 문자열을 입력할 수 있는 보기를 표시합니다. 컨트롤러와 액션은 다음과 같습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public 클래스 홈컨트롤러 : 컨트롤러 { 비공개 읽기 전용 IBucket _버킷; public 홈컨트롤러(IBucket 버킷) { _버킷 = 버킷; } public ViewResult 색인() { 반환 보기(); } } |
Index.cshtml의 보기는 다음과 같습니다:
|
1 2 3 4 5 6 7 8 |
<h1>검색</h1> @사용 (Html.BeginForm("검색", "홈")) { @Html.텍스트 상자("q","") } |
예쁘지는 않지만 기능적으로는 훌륭합니다. 다음으로 검색 액션을 만들었습니다. 이 작업은 검색 쿼리를 받아 Couchbase에서 결과를 출력합니다. 결과는 문서 ID, 관련성 점수, 강조 표시된 조각 등 Couchbase 콘솔에서 본 것과 매우 유사하게 표시됩니다.
전체 텍스트 검색을 실행하려면 세 단계가 있습니다:
- 구현하는 객체를 인스턴스화합니다.
ISearchQuery. 많은 옵션이 있습니다.매치 쿼리이 예제에서는 - 검색 옵션을 지정하려면 SearchParams 객체를 인스턴스화합니다.
- 사용
IBucket를 사용하여 쿼리+매개변수를 실행하고 결과를 가져옵니다.
이 예제에서는 검색 작업에서 바로 세 단계를 모두 수행했습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public 액션 결과 검색(문자열 q) { 만약 (문자열.IsNullOrEmpty(q)) 반환 보기("색인"); var 쿼리 = new 매치 쿼리(q); var 검색 매개변수 = new 검색 매개변수() .제한(10) .시간 초과(TimeSpan.밀리초부터(10000)) .하이라이트(HighLightStyle.Html); var 결과 = _버킷.쿼리("travel-sample-idx", 쿼리, 검색 매개변수); var 검색 결과 모델 = new 검색 결과 모델(q, 결과); 반환 보기(검색 결과 모델); } |
검색 매개변수에 대한 몇 가지 참고 사항입니다:
- 처음 10개로 제한합니다. 페이징에 사용할 수 있는 Skip() 메서드도 있습니다.
- 시간 제한을 10000ms로 설정하고 있습니다. 인덱스를 올바르게 만들면 결과가 매우 빠르게 반환되지만 인덱스를 수정하여 문제가 발생하면 검색이 빨리 실패하기를 원합니다.
- 하이라이트 스타일을 HTML로 설정하고 있습니다. 이렇게 하면
태그를 조각 결과에서 강조 표시된 검색어 주위에 배치합니다.
또한 검색 결과 모델 보기 모델을 선택합니다. 이렇게 하면 검색 결과(및 사용자가 입력한 키워드)에서 문서 ID, 점수, 조각을 가져오는 데 필요한 매핑을 수행합니다.
|
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 27 28 29 |
public 클래스 검색 결과 모델 { public 목록 결과 { get; 비공개 set; } public 문자열 키워드 { get; 비공개 set; } public 검색 결과 모델(문자열 키워드, ISearchQueryResult 결과 = null) { 키워드 = 키워드; 결과 = 결과 == null ? new 목록() : 결과.조회수.선택(r => new 검색 결과 모델(r)).ToList(); } } public 클래스 검색 결과 모델 { public 문자열 DocumentId { get; 비공개 set; } public double 점수 { get; 비공개 set; } public 목록 조각 { get; set; } public 검색 결과 모델(ISearchQueryRow 검색 쿼리 행) { DocumentId = 검색 쿼리 행.Id; 점수 = 검색 쿼리 행.점수; 조각 = 검색 쿼리 행.조각.선택다수(f => f.가치).ToList(); } } |
마지막으로 Search.cshtml 보기입니다:
|
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 |
@모델 전체 텍스트 검색 예제.모델.검색 결과 모델 <h1>검색</h1> @사용 (Html.BeginForm("검색", "홈")) { @Html.텍스트 상자("q", 모델.키워드) } @만약 (!모델.결과.모든()) { 아니요 결과 발견 } else { foreach (var 결과 in 모델.결과) { <h2>문서: @결과.DocumentId</h2> <h3>점수: @결과.점수</h3> foreach (var 조각 in 결과.조각) { @Html.Raw(조각) } } } |
아주 예쁜 HTML 페이지는 아니지만 기능적으로는 훌륭합니다. 실제로 작동하는 모습은 다음과 같습니다:

결론
이 기능은 개발자 프리뷰일 뿐이며 아직 지원되지 않으며 프로덕션 환경에서는 아직 권장되지 않습니다. 하지만 전체 텍스트 검색은 곧 Couchbase에 도입될 예정입니다. 실제로 이 기능이 구현되는 방식에 대해 의견을 제시할 수 있습니다. 전체 텍스트 검색 기능의 GitHub에서 전체 텍스트 검색 RFC를 클릭하고 자유롭게 질문하거나 피드백을 남겨주세요.
아직 질문이 있으신가요? 도움이 필요하신가요? 댓글을 남겨 주세요, 트위터에서 나를 핑하기를 참조하거나 이메일(matthew.groves AT couchbase DOT com)로 문의하세요.