분류

Couchbase - 학습 포털로 콘텐츠 스토어 만들기

2주 전 맥그로힐이 CouchConf SF에서 발표를 했는데 사용자들이 너무 많은 관심을 보여서 블로그에서 더 자세한 내용을 공유해야겠다고 생각했습니다. 올해 초 맥그로힐과 Couchbase는 협력하여 Couchbase와 ElasticSearch를 함께 사용할 때의 강력한 성능을 보여주는 개념 증명 애플리케이션을 구축했습니다.

이 프로젝트의 목표는 개인화된 결과를 제공하는 자가 적응형 학습 포털을 구축하는 것이었습니다. 구체적으로 말하자면

  • 사용자가 다양한 콘텐츠(문서, 이미지, 동영상)를 탐색하고 검색할 수 있도록 허용합니다.
  • 콘텐츠와 메타데이터 모두에 빠르게 액세스
  • 사용자 행동 및 작업을 기반으로 사용자 프로필 향상
  • 사용자의 프로필을 검색 쿼리에 통합하여 개인화된 결과를 제공하세요.

아키텍처

모든 콘텐츠 메타데이터와 텍스트 기사의 전체 텍스트 소스를 저장하는 데 Couchbase Server를 사용했습니다. 이를 통해 애플리케이션은 밀리초 미만의 지연 시간으로 기본 데이터 세트에 액세스할 수 있습니다.

애플리케이션의 전체 텍스트 검색 요구 사항을 처리하기 위해 ElasticSearch가 선택되었습니다. ElasticSearch는 풍부한 쿼리 기능과 뛰어난 클러스터링 기능을 결합하여 Couchbase와 매우 잘 어울립니다. Couchbase Server와 ElasticSearch 간의 통합은 카우치베이스 전송 플러그인. 이 전송은 Couchbase Server 2.0의 데이터 센터 간 복제 기능을 사용하여 모든 문서 변형을 ElasticSearch 인덱스로 안정적으로 전송합니다(여기에서 자세히 알아보세요.).

프런트엔드에서는 Ruby on Rails를 사용해 애플리케이션을 구축하기로 결정했습니다. 코드의 주요 목표는 Couchbase와 ElasticSearch를 함께 사용할 때의 모범 사례를 명확하게 문서화하는 것이었습니다.

학습 포털

사용자가 애플리케이션에 처음 로그인하면 표시되는 화면은 다음과 같습니다.

카우치베이스 클라이언트 SDK를 사용하여 문서에 빠르게 액세스하기

사용자가 특정 콘텐츠를 선택하면 해당 키에 의해 데이터가 Couchbase Server에서 직접 로드됩니다. 다음은 Couchbase의 샘플 문서입니다:

{
"title": "빈스 쉴즈",
"url": "https://en.wikipedia.org/wiki/Vince_Shields",
"type": "text",
"is_text": 1,
"is_video": 0,
"is_image": 0,
"인기": 0,
"views": 0,
"카테고리": [
"1900년 출생",
"1952년 사망자",
"뉴브런즈윅에서 온 야구인들",
"캐나다 야구 투수 스텁",
"포트 스미스 트윈스 선수",
"독립 프로듀서 플레이어",
"메이저리그 야구 투수",
"캐나다 출신 메이저리그 야구 선수",
"프레데릭턴에서 온 사람들",
"세인트루이스 카디널스 선수"
],
"timestamp": “2012-01-06T02:27:11Z”,
"content": "{{인포박스 MLB 플레이어n|이름=빈스 쉴즈...",
"authors": [
{
"name": "철자 전문가 크리스"
}
],
"기여자": [
{
"name": "철자 전문가 크리스",
"timestamp": “2012-01-06T02:27:11Z”
}
]
}

 

카우치베이스 맵을 사용하여 상위 기여자 및 상위 태그 조회수 줄이기

시스템 사용자는 시스템 상위 기여자 및 상위 태그를 탐색하여 콘텐츠를 탐색할 수 있습니다.

 

상위 태그가 어떻게 결정되는지 자세히 살펴보겠습니다.

먼저, 저희가 사용하고 있는 지도 기능은 다음과 같습니다:

함수(doc){
만약 (doc.유형){
doc.카테고리.forEach(함수(카테고리){
emit(카테고리, null);
});
}
}

그리고 기본 제공 축소 기능을 사용하고 있습니다. _count

그룹 수준을 1로 설정하여 이 보기에 액세스하면 각 태그와 해당 태그가 문서를 설명하는 데 사용된 횟수를 볼 수 있습니다.

 

Couchbase 보기는 키별로 정렬되므로 상위 8개 태그를 직접 쿼리할 수 없습니다. 대신 10분마다 실행되는 작업을 통해 이 보기를 쿼리하고 결과를 정렬한 다음 상위 8개 결과를 Couchbase의 다른 문서에 저장합니다. 다음은 그 문서의 모습입니다:

{
"태그": [
{
"name": "살아있는 사람들",
"count": 27554
},
{
"name": "간단한 설명 매개변수가 없는 개인 데이터 템플릿",
"count": 20971
},
{
"name": "출처가 없는 문장이 포함된 모든 기사",
"count": 13509
},
{
"name": "문서 피드백 블랙리스트",
"count": 9205
},
{
"name": "hCard가 있는 기사",
"count": 9028
},
{
"name": "동의어 페이지",
"count": 5912
},
{
"name": "2009년 12월의 출처가 없는 기사",
"count": 4158
},
{
"name": "카테고리가 설정되지 않은 커먼즈 카테고리 템플릿",
"count": 2904
}
]
}

이제 10분마다 업데이트되는 인기 태그에 매우 빠르게 액세스할 수 있습니다.

전체 텍스트 검색

시스템 사용자는 복잡한 검색 쿼리를 수행할 수도 있습니다.

 

이 인터페이스를 사용해 사용자는 "물"이라는 용어를 검색할 수 있습니다. 그러면 검색 쿼리가 ElasticSearch로 전송됩니다:

{
"query": {
"쿼리 문자열": {
"query": "물"
}
}
}

이 특정 쿼리는 42개의 문서와 일치하며, 아래는 1개의 문서가 표시된 응답의 하위 집합입니다:

{
"취하다": 5,
"timed_out": false,
"_shards": {
"total": 5,
"성공": 5,
"실패": 0
},
"조회수": {
"total": 42,
"max_score": 1.0178552,
"조회수": [
{
"_index": "learning_portal",
"_유형": 카우치베이스 문서,
"_id": 18087337,
"_score": 1.0178552,
"_source": {
"meta": {
"id": 18087337,
"rev": 1-0017a16b2b29dc9c0000000000000000,
"flags": 0,
"만료": 0
}
}
},...

여기서 주목해야 할 중요한 점은 전체 문서 본문이 ElasticSearch의 응답에 포함되지 않는다는 것입니다. 이는 전체 소스 문서를 저장하지 않도록 인덱스를 구성했기 때문에 의도적으로 그렇게 한 것입니다. 그 이유는 간단합니다. 우리는 이미 Couchbase에서 문서에 빠르게 액세스할 수 있기 때문입니다. Couchbase 클라이언트 SDK를 사용하면 다중 가져오기 작업을 수행하고 문서 본문을 효율적으로 가져올 수 있습니다. 이를 통해 검색 결과 화면을 렌더링할 수 있습니다:

 

자세한 정보

  • 크리스 체가 CouchConf에서 진행한 프레젠테이션을 확인하세요.
  • 학습 포털의 모든 소스 코드는 다음에서 확인할 수 있습니다. github
  • Couchbase ElasticSearch 통합에 대해 자세히 알아보고 궁금한 점을 해소하고 싶으신가요? 다음에 등록하세요. 10월 24일 웨비나에 참석하세요
이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 마티 쇼흐

Marty Schoch는 Couchbase의 선임 소프트웨어 엔지니어입니다. Marty는 Elasticsearch용 Couchbase 플러그인과 N1QL 초기 버전의 저자입니다. 또한 Couchbase Go SDK의 핵심 기여자이기도 하며, Go를 사용해 여러 실험적인 Couchbase Labs 프로젝트에 참여했습니다. 현재 Marty는 Couchbase의 향후 버전을 위한 새로운 인덱스 기술을 연구하고 있습니다. 그는 메릴랜드 대학교 칼리지 파크에서 컴퓨터 과학 학사 학위를 받았습니다.

댓글 하나

  1. 무자야 조슈아 10월 10, 2012에서 7:41 오전

    아주 좋아요! 굉장해요. CouchBase는 정말 놀랍습니다. 하지만 CouchBase 2.0에 대한 표준 Erlang/OTP SDK가 없다는 점이 아쉽습니다. Erlang과 같은 언어가 빠진 이유가 있나요? 어쨌든, 이 포스팅에 감사드립니다.

    1. 매트 인젠트론 1월 18, 2013에서 7:54 오후

      아직 완전한 SDK는 없지만, 같은 생각을 가진 사람들이 만든 NIF 기반 오픈 소스 클라이언트 라이브러리가 있습니다. 링크는 다음 링크에 있습니다. https://www.couchbase.com/devel.... 이에 대한 추가적인 의견이나 기여가 있으면 좋겠습니다!

  2. Couchbase로 프로젝트를 만들고 싶지만 PHP 5와 연결할 수 없습니다.

    저는 Windows 7 64비트와 CouchBase Server 2.0에서 Xampp를 사용하고 있습니다.

    누가 도와줄 수 있나요?

    모든 방법을 다 써봤어요.

    1. 안녕하세요 사이먼,

      이 포럼에 댓글을 게시하는 것이 지원을 받는 가장 좋은 방법은 아닙니다. 다음 중 한 곳에 질문을 게시하는 것이 좋습니다:

      1. 카우치베이스 구글 그룹:

      https://groups.google.com/foru...

      2. 카우치베이스 포럼

      https://www.couchbase.com/forum...

댓글 남기기

Ready to get started with Couchbase Capella?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.