소개
전체 텍스트 검색(FTS) 색인 생성은 일반적으로 검색에 익숙하지 않은 사람들에게는 어려울 수 있습니다. 이 게시물에서는 몇 가지 일반적인 검색 사용 사례를 살펴보고 Couchbase FTS 색인 모범 사례에 따라 적절한 색인을 만드는 과정을 살펴봅니다.
사용 사례
다음과 같은 일반적인 검색 사용 사례를 살펴봅니다:
- 간단한 검색
- 필드 독립 검색
- 가장 가까운 이웃 찾기
- 항상 변경되는 모델로 문서 검색하기
여행 샘플 데이터 모델
이 문서에서는 이 문서 전체에서 설치 가능한 여행 샘플 데이터 세트 를 추가할 수 있습니다. 여행 샘플 버킷에는 항공사, 노선, 공항, 랜드마크, 호텔 등 여러 가지 문서 유형이 있습니다. 각 문서 유형에 대한 문서 모델에는 다음이 포함됩니다:
- 기본 키 역할을 하는 키
- 문서를 식별하는 ID 필드
- 문서의 종류를 식별하는 유형 필드입니다.
다음 그림은 여행 샘플 버킷에 있는 여러 종류의 문서 간의 관계를 보여줍니다. 각 문서에 있는 기본 키, ID 및 유형 필드와 각 문서 유형의 대표 필드 몇 개가 표시되어 있습니다. (랜드마크 문서는 사진에 표시되지 않습니다.)
그림 0: 여행 샘플 데이터 모델의 문서
사용 사례 예시
간편 검색
사용 사례 요약: 사용자가 호텔 설명 필드에 키워드를 검색하여 호텔을 찾고 일치하는 호텔 목록을 확인할 수 있습니다.
인덱스 생성 단계:
- 전체 텍스트 검색 UI에서 "색인 추가".
- 인덱스 이름(예: "hotel_desc")을 지정하고 여행 샘플 버킷을 선택합니다.
- 여행 샘플 버킷의 각 문서에는 문서의 유형을 나타내는 "type" 필드가 있으므로 "JSON 유형 필드"를 "type"으로 설정해 두세요.
- 유형 매핑 아래에서:
- "+ 유형 매핑 추가'를 입력하고 모든 호텔 문서를 검색해야 하므로 유형 이름으로 '호텔'을 지정합니다.
- 사용 가능한 분석기 목록은 유형 이름 필드 오른쪽에 있는 풀다운 메뉴를 통해 액세스할 수 있습니다. 이 사용 사례의 경우, "상속"을 선택한 상태로 두십시오. 유형 매핑이 인덱스에서 기본 분석기를 상속하도록 합니다.
- 호텔 설명 필드만 검색해야 하므로 "지정된 필드만 색인화". 이 옵션을 선택하면 문서에서 사용자가 지정한 필드만 인덱스에 포함됩니다. 호텔 유형 매핑(매핑은 동적이지 않습니다.로 설정하여 모든 필드를 인덱싱할 수 있는 것으로 간주합니다.).
- 확인을 클릭합니다.
- 호텔 유형 매핑이 있는 행 위에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 설명 필드를 인덱스에 개별적으로 포함할 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인할 필드의 이름인 '설명'을 입력합니다.
- 유형으로 설정합니다: 설명 필드에 대한 텍스트로 설정합니다.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 분석기를 사용합니다: 유형 매핑에서 수행한 것과 같습니다, 이 사용 사례의 경우 "상속"을 선택한 상태로 두십시오. 유형 매핑이 기본 분석기를 상속하도록 설정합니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 이 설정은 검색에서 반환된 값에 필드 콘텐츠를 포함하고 결과에서 일치하는 표현식을 강조 표시할 수 있지만 인덱스의 크기와 빌드 시간이 늘어납니다. 이 사용 사례의 결과를 강조 표시할 필요가 없으므로 이 옵션을 선택하지 않은 상태로 둡니다.
- "_모든 필드에 포함" 확인란을 선택합니다: 선택 취소 사용 사례는 설명 필드를 구체적으로 검색하는 것이기 때문입니다.
- "용어 벡터 포함" 확인란을 선택합니다: 특정 종류의 기능(예: 강조 표시, 구문 검색)에는 용어 벡터가 필요하지만 인덱스의 크기와 빌드 시간이 늘어납니다. 선택 취소 사용 사례는 강조 표시가 없는 키워드 검색이므로 이 상자를 선택하지 마세요.
- 클릭 확인.
- 마지막으로, 선택 취소 '기본' 유형 매핑 옆의 확인란을 선택합니다. 기본 매핑을 활성화한 상태로 두면 사용자가 적극적으로 유형 매핑을 지정했는지 여부에 관계없이 버킷의 모든 문서가 인덱스에 포함됩니다. 호텔 서류만 필요하며, 이전에 추가한 호텔 유형 매핑에 포함되어 있습니다.
- 나머지 접힌 패널(분석기, 사용자 지정 필터, 날짜/시간 파서 및 고급)은 기본값으로 충분합니다.
- 인덱스 복제본은 클러스터가 n+1 노드에서 검색 서비스를 실행하는 경우 1, 2 또는 3으로 설정할 수 있습니다. 단일 노드 개발 클러스터에서는 기본값인 0을 유지합니다.
- 인덱스 유형의 경우, 새로 생성된 인덱스에는 기본값인 '버전 6.0(Scorch)'이 적합합니다. Scorch는 디스크의 인덱스 크기를 줄이고 인덱싱 및 변경 처리를 위한 향상된 성능을 제공합니다.
- 이 시점에서 인덱스 생성 페이지는 그림 1에서 캡처한 마지막 프레임과 같아야 합니다. "색인 만들기'를 클릭하여 프로세스를 완료합니다.
그림 1 - 인덱스 생성 "hotel_desc"
참고: REST API로 이 인덱스를 생성하는 데 사용된 JSON 페이로드는 부록 A의 "Index: hotel_desc"를 참조하세요.
인덱스에 대해 쿼리를 테스트합니다:
- 전체 텍스트 검색 UI에서 인덱싱 진행률이 100%로 표시될 때까지 기다린 다음 인덱스 이름 "hotel_desc"를 클릭합니다.
- 설명에 '농장' 키워드가 포함된 호텔을 검색하려면 '이 색인 검색...' 텍스트 상자에 '설명: 농장'을 입력한 후 검색을 클릭합니다. 이 검색의 필드 범위 지정은 다음과 같은 이유로 필수입니다. "_모든 필드에 포함" 확인란이 선택되지 않은 채로 방치되어 있습니다.
- 결과는 (그림 2와 유사하게) 일치하는 각 문서의 키와 함께 표시됩니다.
그림 2 - "description:farm"에 대한 "hotel_desc" 색인 검색
4. curl을 사용하여 REST API를 통해 동일한 검색을 실행할 수 있습니다:
1 2 3 4 5 6 7 8 9 10 11 12 |
curl -u 사용자 이름:비밀번호 -XPOST -H "콘텐츠 유형: 애플리케이션/json" \ http://localhost:8094/api/index/hotel_desc/query \ -d '{ "설명": true, "필드": [ "*" ], "하이라이트": {}, "query": { "query": "설명:농장" } }' |
필드 독립적 검색
사용 사례 요약: 사용자가 키워드에 대한 호텔 이름, 별칭, 설명, 주소, 리뷰 필드를 검색하여 호텔을 찾고 일치하는 호텔 목록을 확인할 수 있습니다. 강조 표시된 일치 항목이 포함된.
인덱스 생성 단계:
- 전체 텍스트 검색 UI에서 "색인 추가".
- 인덱스 이름(예: "hotel_mult_fields")을 지정하고 여행 샘플 버킷을 선택합니다.
- 여행 샘플 버킷의 각 문서에는 문서의 유형을 나타내는 "type" 필드가 있으므로 "JSON 유형 필드"를 "type"으로 설정해 두세요.
- 유형 매핑 아래에서:
- "+ 유형 매핑 추가'를 입력하고 모든 호텔 문서를 검색해야 하므로 유형 이름으로 '호텔'을 지정합니다.
- 사용 가능한 분석기 목록은 유형 이름 필드 오른쪽에 있는 풀다운 메뉴를 통해 액세스할 수 있습니다. 이 사용 사례의 경우, 유형 매핑이 인덱스에서 기본 분석기를 상속하도록 '상속'을 선택한 상태로 둡니다.
- 호텔 이름, 별칭, 설명, 주소, 리뷰 필드를 검색해야 하므로 "지정된 필드만 색인화". 이 옵션을 선택하면 문서에서 사용자가 지정한 필드만 호텔 유형 매핑의 색인에 포함됩니다(매핑은 동적이 아니므로 모든 필드를 색인화할 수 있는 것으로 간주됨).
- 클릭 확인.
- 호텔 유형 매핑에 5개의 필드를 각각 추가합니다:
- 이름: 호텔 유형 매핑이 있는 행에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 이름 필드가 인덱스에 개별적으로 포함될 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인할 필드의 이름인 '이름'을 입력합니다.
- 유형으로 설정합니다: 이름 필드의 텍스트로 이 설정을 그대로 둡니다.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 분석기를 사용합니다: 유형 매핑에서 수행한 것과 같습니다, 이 사용 사례의 경우 "상속"을 선택한 상태로 두십시오. 유형 매핑이 기본 분석기를 상속하도록 설정합니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 확인 이 설정 를 사용하여 검색 결과에 필드 콘텐츠를 포함시켜 결과에서 일치하는 표현식을 강조 표시할 수 있습니다.
- "_모든 필드에 포함" 확인란을 선택합니다: 사용 사례 요구 사항이 여러 필드를 검색하는 것이므로 이 확인란을 선택된 상태로 둡니다.
- "용어 벡터 포함" 확인란을 선택합니다: 사용 사례에 결과 강조 표시가 필요하므로 이 확인란을 선택된 상태로 둡니다.
- 클릭 확인.
- 별칭: 호텔 유형 매핑이 있는 행 위에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 이름 필드가 인덱스에 개별적으로 포함될 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인할 필드의 이름인 '별칭'을 입력합니다.
- 유형으로 설정합니다: 이름 필드의 텍스트로 이 설정을 그대로 둡니다.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 분석기를 사용합니다: 유형 매핑에서 수행한 것과 같습니다, 이 사용 사례의 경우 "상속"을 선택한 상태로 두십시오. 유형 매핑이 기본 분석기를 상속하도록 설정합니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 확인 이 설정 를 사용하여 검색 결과에 필드 콘텐츠를 포함시켜 결과에서 일치하는 표현식을 강조 표시할 수 있습니다..
- "_모든 필드에 포함" 확인란을 선택합니다: 사용 사례 요구 사항이 여러 필드를 검색하는 것이므로 이 확인란을 선택된 상태로 둡니다.
- "용어 벡터 포함" 확인란을 선택합니다: 사용 사례에 결과 강조 표시가 필요하므로 이 확인란을 선택된 상태로 둡니다.
- 클릭 확인.
- 설명: 호텔 유형 매핑이 있는 행 위에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 이름 필드가 인덱스에 개별적으로 포함될 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인할 필드의 이름인 '설명'을 입력합니다.
- 유형으로 설정합니다: 이름 필드의 텍스트로 이 설정을 그대로 둡니다.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 분석기를 사용합니다: 유형 매핑에서 수행한 것과 같습니다, 이 사용 사례의 경우 "상속"을 선택한 상태로 두십시오. 유형 매핑이 기본 분석기를 상속하도록 설정합니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 확인 이 설정 를 사용하여 검색 결과에 필드 콘텐츠를 포함시켜 결과에서 일치하는 표현식을 강조 표시할 수 있습니다.
- "_모든 필드에 포함" 확인란을 선택합니다: 사용 사례 요구 사항이 여러 필드를 검색하는 것이므로 이 확인란을 선택된 상태로 둡니다.
- "용어 벡터 포함" 확인란을 선택합니다: 사용 사례에 결과 강조 표시가 필요하므로 이 확인란을 선택된 상태로 둡니다.
- 클릭 확인.
- 주소: 호텔 유형 매핑이 있는 행 위에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 이름 필드가 인덱스에 개별적으로 포함될 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인할 필드의 이름인 '주소'를 입력합니다.
- 유형으로 설정합니다: 이름 필드의 텍스트로 이 설정을 그대로 둡니다.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 분석기를 사용합니다: 유형 매핑에서 수행한 것과 같습니다, 이 사용 사례의 경우 "상속"을 선택한 상태로 두십시오. 유형 매핑이 기본 분석기를 상속하도록 설정합니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 확인 이 설정을 사용하면 검색 결과에 필드 콘텐츠가 포함되어 일치하는 표현식을 결과에서 강조 표시할 수 있습니다.
- "_모든 필드에 포함" 확인란을 선택합니다: 사용 사례 요구 사항이 여러 필드를 검색하는 것이므로 이 확인란을 선택된 상태로 둡니다.
- "용어 벡터 포함" 확인란을 선택합니다: 사용 사례에 결과 강조 표시가 필요하므로 이 확인란을 선택된 상태로 둡니다.
- 클릭 확인.
- 리뷰: 호텔 유형 매핑이 있는 행 위에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 이름 필드가 인덱스에 개별적으로 포함될 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인화할 필드의 이름인 '리뷰'를 입력합니다.
- 유형으로 설정합니다: 이름 필드의 텍스트로 이 설정을 그대로 둡니다.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 분석기를 사용합니다: 유형 매핑에서 수행한 것과 같습니다, 이 사용 사례의 경우 "상속"을 선택한 상태로 두십시오. 유형 매핑이 기본 분석기를 상속하도록 설정합니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 확인 이 설정 를 사용하여 검색 결과에 필드 콘텐츠를 포함시켜 결과에서 일치하는 표현식을 강조 표시할 수 있습니다.
- "_모든 필드에 포함" 확인란을 선택합니다: 사용 사례 요구 사항이 여러 필드를 검색하는 것이므로 이 확인란을 선택된 상태로 둡니다.
- "용어 벡터 포함" 확인란을 선택합니다: 사용 사례에 결과 강조 표시가 필요하므로 이 확인란을 선택된 상태로 둡니다.
- 클릭 확인.
- 이름: 호텔 유형 매핑이 있는 행에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 이름 필드가 인덱스에 개별적으로 포함될 수 있습니다. 다음을 지정합니다:
- 마지막으로, 선택 취소 '기본' 유형 매핑 옆의 확인란을 선택합니다. 기본 매핑을 활성화한 상태로 두면 사용자가 적극적으로 유형 매핑을 지정했는지 여부에 관계없이 버킷의 모든 문서가 인덱스에 포함됩니다. 호텔 서류만 필요하며, 이전에 추가한 호텔 유형 매핑에 포함되어 있습니다.
- 나머지 접힌 패널(분석기, 사용자 지정 필터, 날짜/시간 파서 및 고급)은 기본값으로 충분합니다.
- 인덱스 복제본은 클러스터가 n+1 노드에서 검색 서비스를 실행하는 경우 1, 2 또는 3으로 설정할 수 있습니다. 단일 노드 개발 클러스터에서는 기본값인 0을 유지합니다.
- 인덱스 유형의 경우, 새로 생성된 인덱스에는 기본값인 '버전 6.0(Scorch)'이 적합합니다. Scorch는 디스크에 있는 인덱스의 크기를 줄이고 인덱싱 및 변경 처리를 위한 향상된 성능을 제공합니다.
- 이 시점에서 인덱스 생성 페이지는 그림 3에서 캡처한 마지막 프레임과 같아야 합니다. "색인 만들기'를 클릭하여 프로세스를 완료합니다.
그림 3 - "hotel_mult_fields" 인덱스 생성
참고: REST API를 통해 이 인덱스를 생성하는 데 사용된 JSON 페이로드는 부록 A의 '인덱스: hotel_mult_fields'를 참조하세요.
인덱스에 대해 쿼리를 테스트합니다:
- 전체 텍스트 검색 UI에서 인덱싱 진행률이 100%로 표시될 때까지 기다린 다음, 인덱스 이름 "hotel_mult_fields"를 클릭합니다.
- 이름, 별칭, 설명, 주소 또는 후기 필드에 '농장' 키워드가 포함된 호텔을 검색하려면 '이 색인 검색...' 텍스트 상자에 '농장'을 입력하고 검색을 클릭합니다. 검색의 필드 범위 지정은 필요하지 않습니다. "호텔 유형 매핑에서 인덱싱된 각 필드에 대해 '_모든 필드에 포함' 확인란이 선택되어 있습니다.
- 결과는 그림 4와 유사하게 각 일치하는 문서의 키와 각 일치하는 문서에서 강조 표시된 일치 항목과 함께 표시됩니다.
그림 4 - "farm"에 대한 "hotel_mult_fields" 검색 결과 색인화
4. curl을 사용하여 REST API를 통해 동일한 검색을 실행할 수 있습니다:
1 2 3 4 5 6 7 8 9 10 11 12 |
curl -u 사용자 이름:비밀번호 -XPOST -H "콘텐츠 유형: 애플리케이션/json" \ http://localhost:8094/api/index/hotel_mult_fields/query \ -d '{ "설명": true, "필드": [ "*" ], "하이라이트": {}, "query": { "query": "farm" } }' |
가장 가까운 이웃 찾기
사용 사례 요약: 사용자가 지정된 위치에서 특정 거리 내에 있는 호텔을 찾고 지정된 위치에서 거리별로 정렬된 일치하는 호텔 이름 목록을 볼 수 있습니다.
인덱스 생성 단계:
- 전체 텍스트 검색 UI에서 "색인 추가".
- 인덱스 이름(예: "hotel_geo")을 지정하고 여행 샘플 버킷을 선택합니다.
- 여행 샘플 버킷의 각 문서에는 문서의 유형을 나타내는 "type" 필드가 있으므로 "JSON 유형 필드"를 "type"으로 설정해 두세요.
- 유형 매핑 아래에서:
- "+ 유형 매핑 추가'를 입력하고 모든 호텔 문서를 검색해야 하므로 유형 이름으로 '호텔'을 지정합니다.
- 사용 가능한 분석기 목록은 유형 이름 필드 오른쪽에 있는 풀다운 메뉴를 통해 액세스할 수 있습니다. 이 사용 사례의 경우, 유형 매핑이 인덱스에서 기본 분석기를 상속하도록 '상속'을 선택한 상태로 둡니다.
- 호텔 위치만 검색해야 하므로 "지정된 필드만 색인화". 이 옵션을 선택하면 문서에서 사용자가 지정한 필드만 호텔 유형 매핑의 색인에 포함됩니다(매핑은 동적이 아니므로 모든 필드를 색인화할 수 있는 것으로 간주됨).
- 클릭 확인.
- 호텔 유형 매핑에 지역 및 이름 필드를 추가합니다:
- Geo: 호텔 유형 매핑이 있는 행 위에 마우스를 놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 지역 필드를 인덱스에 개별적으로 포함할 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인할 필드의 이름인 'geo'를 입력합니다.
- 유형으로 설정합니다: 유형: 다음과 같이 설정합니다. 지오포인트.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 확인 이 설정을 사용하면 검색 결과에 필드 콘텐츠를 포함할 수 있습니다.
- "_모든 필드에 포함" 확인란을 선택합니다: 사용 사례 요구 사항이 지역 필드를 검색하는 것이므로 이 확인란을 선택된 상태로 둡니다.
- 확인을 클릭합니다.
- 이름: 호텔 유형 매핑이 있는 행에 마우스를 올려놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 이름 필드가 인덱스에 개별적으로 포함될 수 있습니다. 다음을 지정합니다:
- 필드를 클릭합니다: 색인할 필드의 이름인 '이름'을 입력합니다.
- 유형으로 설정합니다: 이름 필드의 텍스트로 이 설정을 그대로 둡니다.
- 로 검색할 수 있습니다: 현재 사용 사례의 필드 이름과 동일하게 유지합니다. 대체 필드 이름을 나타내는 데 사용할 수 있습니다.
- 분석기를 사용합니다: 유형 매핑에서 수행한 것과 같습니다, 이 사용 사례의 경우 "상속"을 선택한 상태로 두십시오. 유형 매핑이 기본 분석기를 상속하도록 설정합니다.
- 색인 확인란을 선택합니다: 필드가 색인에 포함되도록 이 확인란을 선택된 상태로 둡니다. 이 확인란을 선택 취소하면 색인에서 필드가 명시적으로 제거됩니다.
- 저장 확인란을 선택합니다: 확인 이 설정을 사용하면 검색 결과에 필드 콘텐츠를 포함할 수 있습니다.
- "_모든 필드에 포함" 확인란을 선택합니다: 선택 취소 이 사용 사례의 요구 사항은 위치로만 검색하되 검색 결과에 이름을 표시하는 것이기 때문입니다.
- "용어 벡터 포함" 확인란을 선택합니다: 특정 종류의 기능(예: 강조 표시, 구문 검색)에는 용어 벡터가 필요하지만 인덱스의 크기와 빌드 시간이 늘어납니다. 선택 취소 사용 사례는 지리적 위치로만 검색하는 것이므로 이 상자를 선택하지 마세요.
- 확인을 클릭합니다.
- Geo: 호텔 유형 매핑이 있는 행 위에 마우스를 놓고 + 버튼을 클릭한 다음 "하위 필드 삽입". 이렇게 하면 호텔 지역 필드를 인덱스에 개별적으로 포함할 수 있습니다. 다음을 지정합니다:
- 마지막으로, 선택 취소 '기본' 유형 매핑 옆의 확인란을 선택합니다. 기본 매핑을 활성화된 상태로 두면 사용자가 적극적으로 유형 매핑을 지정했는지 여부에 관계없이 버킷의 모든 문서가 색인에 포함됩니다. 호텔 문서만 필요하며 이전에 추가한 호텔 유형 매핑에 의해 포함됩니다.
- 나머지 접힌 패널(분석기, 사용자 지정 필터, 날짜/시간 파서 및 고급)은 기본값으로 충분합니다.
- 인덱스 복제본은 클러스터가 n+1 노드에서 검색 서비스를 실행하는 경우 1, 2 또는 3으로 설정할 수 있습니다. 단일 노드 개발 클러스터에서는 기본값인 0을 유지합니다.
- 인덱스 유형의 경우, 새로 생성된 인덱스에는 기본값인 '버전 6.0(Scorch)'이 적합합니다. Scorch는 디스크에 있는 인덱스의 크기를 줄이고 인덱싱 및 변경 처리를 위한 향상된 성능을 제공합니다.
- 이 시점에서 색인 생성 페이지는 그림 5와 같이 표시되어야 합니다. "색인 만들기'를 클릭하여 프로세스를 완료합니다.
그림 5 - 인덱스 생성 "hotel_geo"
참고: REST API를 통해 이 인덱스를 생성하는 데 사용된 JSON 페이로드는 부록 A의 "Index: hotel_geo"를 참조하세요.
인덱스에 대해 쿼리를 테스트합니다:
- 전체 텍스트 검색 UI에서 인덱싱 진행률이 100%로 표시될 때까지 기다립니다.
- Couchbase 웹 콘솔의 검색 UI를 통해 "쿼리 문자열" 쿼리만 테스트할 수 있으므로 이 지리 공간 검색 는 curl을 사용하여 REST API를 통해 테스트됩니다. 샌프란시스코의 한 위치에서 1마일 이내에 가장 가까운 호텔 2곳을 검색하고, 다음 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 27 28 |
curl -u 사용자 이름:비밀번호 -XPOST -H "콘텐츠 유형: 애플리케이션/json" \ http://localhost:8094/api/index/hotel_geo/query \ -d '{ "from": 0, "크기": 2, "필드": [ "이름", "지역" ], "query": { "위치": { "lon": -122.4194, "lat": 37.7749 }, "거리": "1mi", "field": "geo" }, "정렬": [ { "by": "지리적 거리", "field": "geo", "단위": "mi", "위치": { "lon": -122.4194, "lat": 37.7749 } } ] }' |
3. 쿼리 결과 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
{ "status": { "total": 6, "실패": 0, "성공": 6 }, "요청": { "query": { "위치": [ -122.4194, 37.7749 ], "거리": "1mi", "field": "geo" }, "size": 2, "from": 0, "하이라이트": null, "fields": [ "name", "geo" ], "facets": null, "설명": false, "sort": [ { "by": "지리적 거리", "field": "geo", "위치": { "lat": 37.7749, "lon": -122.4194 }, "단위": "mi" } ], "includeLocations": false }, "조회수": [ { "index": "hotel_geo_72ca6700aea9283d_aa574717", "id": "hotel_25593", "score": 0.09668939164302555, "sort": [ " \u0001?XA7]\u0003\u0010\u0002" ], "fields": { "geo": [ -122.42000007592608, 37.7739999880488 ], "name": "시빅 센터 호텔" } }, { "index": "hotel_geo_72ca6700aea9283d_aa574717", "id": "hotel_26263", "score": 0.09668939164302555, "sort": [ " \u0001?h.>\u001dOJ\"7" ], "fields": { "geo": [ -122.42320003510062, 37.77719998913285 ], "name": "헤이즈 밸리 인" } } ], "total_hits": 37, "max_score": 0.1169539736791776, "취하다": 720591, "facets": null } |
동적 검색
사용 사례 요약: 사용자가 호텔 문서의 속성에 나타나는 키워드를 검색하여 호텔을 찾고 일치하는 호텔 목록을 볼 수 있습니다.
이 경우 필드가 추가 또는 제거되거나 필드가 단순한 문자열에서 객체로 변경되는 등 항상 변화하는 데이터를 검색하고자 하며, 검색은 항상 일치하는 랜드마크를 찾아야 합니다. 이 요구 사항을 충족하기 위해 동적 인덱스를 만들 것입니다.
인덱스 생성 단계:
- 전체 텍스트 검색 UI에서 "색인 추가".
- 인덱스 이름(예: "hotel_dynamic")을 지정하고 여행 샘플 버킷을 선택합니다.
- 여행 샘플 버킷의 각 문서에는 문서의 유형을 나타내는 "type" 필드가 있으므로 "JSON 유형 필드"를 "type"으로 설정해 두세요.
- 유형 매핑 아래에서:
- "+ 유형 매핑 추가'를 입력하고 모든 호텔 문서를 검색해야 하므로 유형 이름으로 '호텔'을 지정합니다.
- 사용 가능한 분석기 목록은 유형 이름 필드 오른쪽에 있는 풀다운 메뉴를 통해 액세스할 수 있습니다. 이 사용 사례의 경우, 유형 매핑이 인덱스에서 기본 분석기를 상속하도록 '상속'을 선택한 상태로 둡니다.
- 모든 호텔 문서 필드를 검색해야 하므로 "지정된 필드만 색인화"를 선택 취소합니다. 이 옵션을 선택하지 않으면 매핑이 동적으로 이루어지며, 이는 모든 필드가 인덱싱에 사용할 수 있는 것으로 간주됨을 의미합니다.
- 확인을 클릭합니다.
- 마지막으로, 선택 취소 '기본' 유형 매핑 옆의 확인란을 선택합니다. 기본 매핑을 활성화된 상태로 두면 사용자가 적극적으로 유형 매핑을 지정했는지 여부에 관계없이 버킷의 모든 문서가 색인에 포함됩니다. 호텔 문서만 필요하며 이전에 추가한 호텔 유형 매핑에 의해 포함됩니다.
- 나머지 접힌 패널(분석기, 사용자 지정 필터, 날짜/시간 파서 및 고급)은 기본값으로 충분합니다.
- 인덱스 복제본은 클러스터가 n+1 노드에서 검색 서비스를 실행하는 경우 1, 2 또는 3으로 설정할 수 있습니다. 단일 노드 개발 클러스터에서는 기본값인 0을 유지합니다.
- 인덱스 유형의 경우, 새로 생성된 인덱스에는 기본값인 '버전 6.0(Scorch)'이 적합합니다. Scorch는 디스크에 있는 인덱스의 크기를 줄이고 인덱싱 및 변경 처리를 위한 향상된 성능을 제공합니다.
- 이 시점에서 색인 생성 페이지는 그림 5와 같이 표시되어야 합니다. "색인 만들기'를 클릭하여 프로세스를 완료합니다.
그림 6 - 인덱스 생성 "hotel_dynamic"
참고: REST API를 통해 이 인덱스를 생성하는 데 사용된 JSON 페이로드는 부록 A의 '인덱스: 호텔_동적'을 참조하세요.
인덱스에 대해 쿼리를 테스트합니다:
- 전체 텍스트 검색 UI에서 인덱싱 진행률이 100%로 표시될 때까지 기다린 다음, 인덱스 이름 "hotel_dynamic"을 클릭합니다.
- 호텔 문서의 모든 필드에 키워드 'farm'이 포함된 호텔을 검색하려면 '이 색인 검색...' 텍스트 상자에 'farm'을 입력하고 검색을 클릭합니다. 모든 필드가 동적 인덱스에 포함되므로 검색의 필드 범위 지정은 필요하지 않습니다..
- 결과는 (그림 7과 유사하게) 일치하는 각 문서의 키와 함께 표시됩니다.
그림 7 - "farm"에 대한 "hotel_dynamic" 검색 결과 색인화
4. curl을 사용하여 REST API를 통해 동일한 검색을 실행할 수 있습니다:
1 2 3 4 5 6 7 8 9 10 |
curl -u 사용자 이름:비밀번호 -XPOST -H "콘텐츠 유형: 애플리케이션/json" \ http://localhost:8094/api/index/hotel_dynamic/query \ -d '{ "필드": [ "*" ], "query": { "query": "farm" } }' |
부록 A - 인덱스 정의 JSON
색인: hotel_desc
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
{ "type": "전체 텍스트 인덱스", "name": "hotel_desc", "uuid": "", "sourceType": "couchbase", "sourceName": "travel-sample", "sourceUUID": "", "planParams": { "최대 파티션당 인덱스": 171 }, "params": { "doc_config": { "docid_prefix_delim": "", "docid_regexp": "", "모드": "type_field", "type_field": "type" }, "매핑": { "분석": {}, "기본_분석기": "표준", "기본_날짜_파서": "날짜/시간 옵션", "default_field": "_all", "default_mapping": { "동적": true, "enabled": false }, "default_type": "_default", "docvalues_dynamic": true, "index_dynamic": true, "store_dynamic": false, "type_field": "_유형", "types": { "호텔": { "동적": false, "enabled": true, "속성": { "설명": { "동적": false, "enabled": true, "fields": [ { "index": true, "name": "설명", "type": "text" } ] } } } } }, "store": { "indexType": "scorch", "kvStoreName": "" } }, "sourceParams": {} } |
색인: hotel_mult_fields
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
{ "type": "전체 텍스트 인덱스", "name": "hotel_mult_fields", "uuid": "", "sourceType": "couchbase", "sourceName": "travel-sample", "sourceUUID": "", "planParams": { "최대 파티션당 인덱스": 171 }, "params": { "doc_config": { "docid_prefix_delim": "", "docid_regexp": "", "모드": "type_field", "type_field": "type" }, "매핑": { "분석": {}, "기본_분석기": "표준", "기본_날짜_파서": "날짜/시간 옵션", "default_field": "_all", "default_mapping": { "동적": true, "enabled": false }, "default_type": "_default", "docvalues_dynamic": true, "index_dynamic": true, "store_dynamic": false, "type_field": "_유형", "types": { "호텔": { "동적": false, "enabled": true, "속성": { "주소": { "동적": false, "enabled": true, "fields": [ { "IN_IN_ALL": true, "include_term_vectors": true, "index": true, "name": "주소", "store": true, "type": "text" } ] }, "alias": { "동적": false, "enabled": true, "fields": [ { "IN_IN_ALL": true, "include_term_vectors": true, "index": true, "name": "alias", "store": true, "type": "text" } ] }, "설명": { "동적": false, "enabled": true, "fields": [ { "IN_IN_ALL": true, "include_term_vectors": true, "index": true, "name": "설명", "store": true, "type": "text" } ] }, "name": { "동적": false, "enabled": true, "fields": [ { "IN_IN_ALL": true, "include_term_vectors": true, "index": true, "name": "name", "store": true, "type": "text" } ] }, "리뷰": { "동적": false, "enabled": true, "fields": [ { "IN_IN_ALL": true, "include_term_vectors": true, "index": true, "name": "리뷰", "store": true, "type": "text" } ] } } } } }, "store": { "indexType": "scorch", "kvStoreName": "" } }, "sourceParams": {} } |
색인: hotel_geo
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
{ "name": "hotel_geo", "type": "전체 텍스트 인덱스", "params": { "매핑": { "types": { "호텔": { "enabled": true, "동적": false, "속성": { "name": { "enabled": true, "동적": false, "fields": [ { "name": "name", "type": "text", "store": true, "index": true, "include_term_vectors": false, "IN_IN_ALL": false } ] }, "geo": { "enabled": true, "동적": false, "fields": [ { "name": "geo", "type": "지오포인트", "store": true, "index": true, "include_term_vectors": true, "IN_IN_ALL": true } ] } } } }, "default_mapping": { "enabled": false, "동적": true }, "default_type": "_default", "기본_분석기": "표준", "기본_날짜_파서": "날짜/시간 옵션", "default_field": "_all", "store_dynamic": false, "index_dynamic": true }, "store": { "indexType": "scorch", "kvStoreName": "" }, "doc_config": { "모드": "type_field", "type_field": "type", "docid_prefix_delim": "", "docid_regexp": "" } }, "sourceType": "couchbase", "sourceName": "travel-sample", "sourceUUID": "", "sourceParams": {}, "planParams": { "최대 파티션당 인덱스": 171, "numReplicas": 0 }, "uuid": "" } |
색인: hotel_dynamic
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
{ "name": "hotel_dynamic", "type": "전체 텍스트 인덱스", "params": { "매핑": { "types": { "호텔": { "enabled": true, "동적": true } }, "default_mapping": { "enabled": false, "동적": true }, "default_type": "_default", "기본_분석기": "표준", "기본_날짜_파서": "날짜/시간 옵션", "default_field": "_all", "store_dynamic": false, "index_dynamic": true }, "store": { "indexType": "scorch", "kvStoreName": "" }, "doc_config": { "모드": "type_field", "type_field": "type", "docid_prefix_delim": "", "docid_regexp": "" } }, "sourceType": "couchbase", "sourceName": "travel-sample", "sourceUUID": "", "sourceParams": {}, "planParams": { "최대 파티션당 인덱스": 171, "numReplicas": 0 }, "uuid": "" } |