본문 바로가기
SingleStoreDB/엔지니어링

Full-Text Search in SingleStore

by 에이플랫폼 [Team SingleStore Korea] 2021. 2. 1.

 

 

오늘 SingleStore에 요청이 많았던 Full-Text Search 기능이 내장되어 있음을 공유합니다. 고객의 피드백 덕분에 real-time application을 구축하는 모든 회사가 이를 이용할 수 있게 되어 기쁘게 생각합니다.

 


 

Full-Text Search란 무엇인가요?

SingleStore가 Fast Searching과 Large String을 지원하는 상태에서 추가적인 기능이 왜 필요한지 궁금할 수 있습니다. 따라서 Full-Text Search(FTS)에 대한 설명부터 시작하겠습니다. Full-Text Search는 두 가지 방법으로 문자열 값을 쿼리 하는 것과 다릅니다.

 

첫 번째는 성능 차이입니다. 때로는 텍스트를 검색할 때 정확히 무엇을 찾는지 알 수 있습니다. 예를 들어, 만약 여러분이 추리 책 목록을 보려면 데이터베이스에 "추리"라는 주제를 가진 모든 책을 찾도록 요청하면 됩니다. 그러나 각각에 많은 단어가 포함된 문서가 많고 문서에 포함된 정보를 모른다면 어떻게 될까요? 특히 "캐나다"에 대한 모든 문서를 찾고 싶다고 가정해 봅시다. LIKE 쿼리 또는 정규식을 사용할 수 있지만 데이터베이스가 아무리 빠르더라도 일반 데이터베이스 인덱스를 사용하면 상당히 느려질 것입니다. 여기서 필요한 것은 문서의 모든 단어와 단어가 나타나는 빈도를 추적하는 다른 종류의 인덱스입니다. 캐나다를 검색할 때 시스템은 캐나다라는 단어가 문서에 나타나는지와 빈도를 빠르게 확인할 수 있습니다. 이를 역 인덱스(inverted index)라 합니다.

 

두 번째는 검색에 많은 일치 항목이 있을 수 있습니다. FTS에는 관련성(relevance) 개념이 포함됩니다. 관련성은 일치(match)가 있는지와 얼마나 일치하는지에 대해 알려줍니다. 이렇게 하면 결과를 정렬하여 가장 관련성이 높은 결과를 먼저 표시할 수 있습니다.

 

역 인덱스 데이터 구조, 형태소 분석 기능 및 관련성 스코어링의 조합은 full-text search가 일반 데이터베이스 쿼리를 사용하는 문자열 검색보다 유리한 이유입니다.

 

Full-Text Search는 SingleStore와 어떻게 통합되었나요?

SingleStore는 인덱스의 개념을 이해하는 시스템이므로 FTS를 SingleStore에 통합하는 것은 비교적 간단했습니다. 우리는 이 새로운 종류의 인덱스를 이해하기 위해 SingleStore를 가르쳐야 했습니다. full-text 인덱싱을 지원하는 대부분의 기술과 마찬가지로 오픈 소스 Lucene 기술을 활용했습니다. Lucene은 업계에서 Full-Text Searching을 위한 강력한 표준 기술입니다. 오랜 시간 사용해왔기 때문에 새롭게 개발할 필요가 없습니다.

 

인덱스를 생성하려면 사용자는 테이블 생성 시 full-text 인덱싱 할 열을 지정하기만 하면 됩니다. 이로 인해 full-text 인덱스가 생성됩니다. 인덱스는 테이블과 동일한 샤딩 패턴을 사용하여 분할되므로 로컬 조인에도 효과적으로 참여할 수 있는 분산 index입니다. 인덱스의 수명주기는 테이블의 수명주기에 의해 관리되므로 추가 작업이 필요 없고 시스템에서 모든 관리를 처리합니다(장애 조치, 재조정, 노드 추가 및 제거, 백업 / 복원 등). 또한 인덱스는 테이블과 동일한 보안 메커니즘과 바인딩 되므로 데이터는 SingleStore의 role-based access control 기능으로 보호됩니다. 이렇게 하면 데이터를 볼 수 있는 권한이 부여된 사용자만 인덱스의 데이터를 사용할 수 있습니다.

 

SQL 쿼리에서 인덱스를 사용하려면 MATCH 문을 포함하기만 하면 됩니다. 이것은 SingleStore와의 통합에 대한 중요한 부분입니다. 기존 검색 방식과 full-text search의 MATCH 문을 같이 필터 하여 사용할 수 있습니다. 이렇게 하면 SQL에 익숙한 사람이 full-text 인덱스를 쉽게 활용할 수 있습니다. 인덱스는 자동으로 샤딩되기 때문에 클러스터의 모든 시스템을 활용하여 인덱스 조회를 할 수 있고 이로 인해 매우 빠른 결과를 얻을 수 있습니다. full-text 쿼리 자체는 표준 Lucene 구문이며 다른 full-text 시스템을 사용하는 사용자에게 익숙할 것입니다.

 

어떻게 사용하나요?

일반 데이터 베이스 응용 프로그램과 함께 FTS를 사용하면 다양한 사례에서 유용하게 사용 가능합니다. 다음은 몇 가지 예입니다.

 

자동 완성

가장 간단한 경우는 애플리케이션의 검색 창에서 자동 완성 기능을 수행하는 겁니다. 이 경우 응용 프로그램에서는 문서가 없으며 문자열 열의 결과가 문자 하위 집합과 일치하는지 신속하게 식별합니다. match 문을 사용하고 열의 full-text를 반환하는 테이블에 대한 간단한 쿼리가 작업을 수행합니다.

 

구조적 및 비 구조적 쿼리 혼합

보험 또는 부동산과 같은 문서 중심인 산업에서는 더 복잡한 사례가 나타납니다. 이러한 사례에서는 문사는 데이터 세트의 핵심 부분이 됩니다. 부동산 거래를 예로 들어 보겠습니다. 위치, 침실 및 욕실 수, 건축 연도 등과 같이 잘 이해되고 구조화하기 쉬운 많은 데이터가 있습니다. 여기서 누군가가 구조화된 쿼리를 사용하여 시스템에 질의하고 특정 위치와 나이뿐만 아니라 문서에 특정 문구가 포함된 계약을 찾습니다. 이 경우 사용자는 위치 및 연령에 대한 구조화된 검색 필터를 사용하여 쿼리를 구성하고 필터에 일치 구문을 추가하여 구문을 찾습니다.

 

사용 예시

먼저 테이블을 만들어 보겠습니다. 이것은 일반 CREATE TABLE 문과 같으며, 추가된 것은 "body" 및 "title" 컬럼에 추가된 FULLTEXT 문입니다. 즉, "body", "title" 컬럼에서 full-text 인덱스를 사용합니다. full-text 인덱스는 문자열 유형에서만 사용 가능합니다. 이제 full-text 인덱스를 사용할 준비가 되었고 데이터를 삽입과 쿼리 작성을 시작할 수 있습니다.

 

CREATE TABLE books(
  id INT UNSIGNED,
  title VARCHAR(100),
  publish_year INT UNSIGNED,
  body TEXT,
  KEY (id) USING CLUSTERED COLUMNSTORE,  
  FULLTEXT (title, body));

 

이제 테이블에 데이터를 넣어 보겠습니다.

INSERT INTO books VALUES (1, 'Typing Test', 1981, 'The quick brown fox jumped over the lazy dog');
INSERT INTO books VALUES(2, 'Ylvis', 2014, 'What does the fox say');
INSERT INTO books VALUES(3, 'Gone With the Wind', 1936, 'In her face were too sharply blended the delicate features of her mother, a Coast aristocrat of French descent, and the heavy ones of her florid Irish father. But it was an arresting face, pointed of chin, square of jaw. Her eyes were pale green without a touch of hazel, starred with bristly black lashes and slightly tilted at the ends. Above them, her thick black brows slanted upward, cutting a startling oblique line in her magnolia-white skin--that skin so prized by Southern women and so carefully guarded with bonnets, veils and mittens against hot Georgia suns.');

 

이제 인덱스가 업데이트되었는지 확인하기 위해 최적화된 테이블을 실행합니다.(삽입은 인덱스에 비동기 적으로 플러시 됩니다.) 실제로는 이 작업을 수행할 필요는 없지만 이 예제의 목적인 인덱스 확인을 위해 수행합니다.

OPTIMIZE TABLE books FLUSH;

 

다음은 기본 full-text 쿼리의 예입니다. 쿼리는 title과 body에서 "fox"문자열이 있는 모든 행을 찾습니다.

SELECT *
FROM books
WHERE MATCH (title, body) AGAINST ('fox');

 

다음 쿼리에서는 full-text 조건에서 "fox"단어가 포함된 책과 구조화된 조건으로 2014년에 출판된 책을 찾습니다.

SELECT count(*)
FROM books
WHERE publish_year = 2014 AND MATCH (body) AGAINST ('fox');

 

text가 얼마나 일치하는지에 대한 점수인 관련성 점수 반환도 지원합니다. 쿼리의 출력 열에 relevance(관련성)을 넣을 수 있습니다.

SELECT id, title, MATCH (body) AGAINST ('Fox') relevance
FROM books
WHERE MATCH (body) AGAINST ('Fox');

 

WHERE 절에서 관련성 점수를 사용하여 필터링할 수 있습니다.

SELECT id, title, MATCH (body) AGAINST ('fox')
FROM books
WHERE MATCH (body) AGAINST ('fox') >= 0.12;

 

이처럼 SingleStore에서 FTS을 수행하는 것은 간단합니다. 지금부터는 Beta Download를 하고 직접 full-text 인덱스 기능을 사용해 보시기 바랍니다.

 

출처:https://www.singlestore.com/blog/full-text-search-in-memsql/

www.a-platform.biz | infor@a-platform.biz