전체 텍스트 검색(FTS)은 콘텐츠 관리 시스템의 주요 기능으로 콘텐츠와 콘텐츠와 관련된 메타데이터를 모두 검색할 수 있습니다. 콘텐츠의 이전 블로그에서 이미 메타데이터를 위한 Couchbase 리포지토리와 함께 Apache Chemistry를 사용하여 콘텐츠 관리를 위한 완전히 확장 가능한 새로운 아키텍처에 대해 설명했습니다(그리고 아마도 블롭). 오늘은 이 아키텍처에서 또 다른 계층(ElasticSearch, Solr, LudicWorks)을 사용하지 않고 확장 가능한 방식으로 FTS 기능을 통합하는 방법에 대해 논의하고자 합니다.
2015년에 Couchbase는 Couchbase 전체 텍스트 검색의 약자인 CBFT의 개발을 발표했으며, 실제로 개발자 프리뷰 버전이 출시되었습니다. CBFT는 대부분의 애플리케이션의 80% 기능을 포괄하는 간단하고 통합된 분산형 전체 텍스트 서버로, CBFT에 대한 자세한 정보는 여기에서 확인할 수 있습니다: http://connect15.couchbase.com/agenda/sneak-peek-cbft-full-text-search-couchbase/
이 글에서는 메타데이터 전체 텍스트 검색을 위해 CMIS Apache Chemistry에서 CBFT를 통합하는 방법을 살펴보겠습니다.
- 설정
Couchbase를 설치하려면 다음 설명서를 따르세요. 여기.
라는 버킷을 만듭니다. cmismeta. 이 버킷에는 각 콘텐츠(폴더, 파일)의 메타데이터가 포함되어 있습니다.
카우치베이스 리포지토리를 사용하여 아파치 케미스트리를 설치하려면 다음 설명서를 따르세요. 여기.
CBFT를 설치하려면 다음 설명서를 따르세요. 여기.
- CBFT 인덱스 만들기
로컬 노드에서 CBFT 시작: cbft -s http://localhost:8091
웹 브라우저에서 cbft의 웹 관리자 UI를 가리키세요: http://localhost:8095
색인 목록 페이지에서 색인 목록의 새 색인 버튼을 클릭합니다.
라는 인덱스를 만듭니다. CMIS-FTS 버킷 cmismeta에서.
- 색인 테스트
인덱스를 테스트하려면 다음에 콘텐츠를 추가해야 합니다. cmismeta 버킷을 생성합니다. 아파치 케미스트리 워크벤치를 사용하여 메타데이터와 연결될 콘텐츠(폴더, 파일)를 만들 수 있습니다. cmismeta 버킷에 추가하거나 테스트를 위해 간단한 콘텐츠를 추가한 후 제거할 수 있습니다.
이 예에서는 이미 콘텐츠 관리 카우치베이스 리포지토리에 많은 파일이 추가되어 있습니다.
쿼리 탭을 열고 다음을 사용하여 쿼리를 입력합니다. 블레브 구문
- CMIS 아파치 화학 프로젝트
먼저 CMIS 카우치베이스 리포지토리 클래스의 전체 텍스트 쿼리 기능을 활성화해야 합니다.
공용 클래스 CouchbaseRepository {
private RepositoryInfo createRepositoryInfo(CmisVersion cmisVersion) {
// 저장소 정보 설정
RepositoryInfoImpl repositoryInfo = 새로운 RepositoryInfoImpl();
repositoryInfo.setCmisVersionSupported(cmisVersion.value());
…
// 리포지토리 기능 설정
RepositoryCapabilitiesImpl 기능 = 새로운 RepositoryCapabilitiesImpl();
capabilities.setCapabilityQuery(CapabilityQuery.FULLTEXTONLY);
…
repositoryInfo.setCapabilities(capabilities);
리포지토리 정보를 반환합니다;
}
}
CBFT 인덱스를 쿼리하기 위해 Jersey 클라이언트와 함께 REST API를 사용하고 있습니다.
먼저 maven pom 파일에 종속성을 추가합니다.
com.sun.jersey
저지 클라이언트
1.8
그런 다음 새 CBFT 서비스 클래스를 만듭니다. 이 서비스에는 CBFT 위치와 인덱스 이름이 필요합니다. 저는 다음을 참조하는 키 목록을 반환하는 간단한 쿼리 메서드를 제공합니다. cmismeta 버킷을 만듭니다.
패키지 org.apache.chemistry.opencmis.couchbase;
java.util.ArrayList를 가져옵니다;
java.util.List를 가져옵니다;
com.couchbase.client.java.document.json.JsonArray를 가져옵니다;
com.couchbase.client.java.document.json.JsonObject를 가져옵니다;
com.sun.jersey.api.client.Client를 가져옵니다;
com.sun.jersey.api.client.ClientResponse를 가져옵니다;
com.sun.jersey.api.client.WebResource를 가져옵니다;
공용 클래스 CBFTService {
private String cbftLocation = null입니다;
비공개 클라이언트 클라이언트 = null;
private String indexid = null;
public CBFTService(String location, String indexid) {
this.cbftLocation = 위치;
this.indexid = indexid;
client = Client.create();
}
/** 검색 cbft 색인.
* 검색할 쿼리를 @param으로 입력합니다.
* 쿼리와 일치하는 키 목록을 반환합니다.
* */
public List query(String query){
목록 결과 = 새 ArrayList();
웹 리소스 웹 리소스 = 클라이언트
.resource("http://"+this.cbftLocation+":8095/api/index/"+indexid+"/query");
문자열 입력 = "{" +
""q": ""+query+""," +
""인덱스 이름": ""+indexid+""," +
""크기": 10,"+
""에서": 0,"+
""설명": true,"+
""하이라이트"": {}," +
""쿼리": {" +
""부스트": 1,"+
""쿼리": ""+query + """+
“},”+
""필드": [" +
“”*”” +
“],” +
""ctl": {" +
""일관성"": {"+
""레벨": ""," +
""벡터": {}"+
“},”+
""시간 초과"": 0″+
“}”+
“}”;
ClientResponse response = webResource.type("application/json")
.post(ClientResponse.class, input);
if (response.getStatus() != 200) {
새로운 런타임 예외("실패 : HTTP 오류 코드 : "
+ 응답.getStatus());
}
문자열 출력 = 응답.getEntity(String.class);
JsonObject content = JsonObject.fromJson(output);
JsonArray hits = content.getArray("hits");
if(hits != null){
문자열 ID;
for(int i=0 ; i<hits.size(); i++){
id = hits.getObject(i).getString("id");
results.add(id);
}
}
결과를 반환합니다;
}
}
이제 워크벤치를 사용하여 콘텐츠 관리 서버를 쿼리하여 CBFT 기능을 사용하여 콘텐츠를 검색하고 결과를 클릭하여 관련 콘텐츠를 볼 수 있습니다.