Spanner Graph에서 전체 텍스트 검색 사용

이 페이지에서는 Spanner Graph에서 전체 텍스트 검색을 사용하는 방법을 설명합니다.

Spanner Graph는 그래프와 전체 텍스트 검색을 하나의 시스템에 결합합니다. 이 조합을 사용하면 그래프의 관계와 함께 비정형 데이터에서 유용한 정보를 도출할 수 있습니다.

시작하기 전에

이 페이지의 예시를 실행하려면 Google Cloud 콘솔을 사용하여 Spanner Graph 설정 및 쿼리 절차를 실행해야 합니다. 이 절차는 다음을 실행합니다.

  1. 인스턴스 만들기
  2. 데이터베이스 만들기
  3. Spanner Graph 데이터베이스의 스키마 만들기
  4. 그래프 데이터 삽입

토큰 및 검색 색인 만들기

전체 텍스트 검색을 사용하기 위한 첫 번째 단계는 검색할 콘텐츠를 토큰화하고 검색 색인을 만드는 것입니다. 전체 텍스트 검색은 검색 색인에 대해 쿼리를 실행합니다.

다음 예에서는 nick_name_token 열을 추가하고 TOKENIZE_FULLTEXT 함수를 사용하여 Account.nick_name 열의 텍스트를 토큰화합니다. 그런 다음 nick_name_token 열에 검색 색인이 생성됩니다.

ALTER TABLE Account
ADD COLUMN nick_name_token TOKENLIST
AS (TOKENIZE_FULLTEXT(nick_name)) STORED HIDDEN;

CREATE SEARCH INDEX AccountTextSearchIndex
ON Account(nick_name_token) STORING (nick_name);

다음 예에서는 TOKENIZE_FULLTEXT 함수를 사용하여 Account.nick_name의 텍스트를 토큰화하고 토큰이 포함된 nick_name_token 열에 검색 색인을 만듭니다.

ALTER TABLE AccountTransferAccount
ADD COLUMN notes STRING(MAX);
ALTER TABLE AccountTransferAccount
ADD COLUMN notes_token TOKENLIST AS (TOKENIZE_FULLTEXT(notes)) STORED HIDDEN;

CREATE SEARCH INDEX TransferTextSearchIndex
ON AccountTransferAccount(notes_token) STORING (notes);

일부 새 열이 AccountAccountTransferAccount에 추가되었으며 검색 함수에서 새 그래프 속성으로 액세스하므로 다음 문을 사용하여 속성 그래프 정의를 업데이트해야 합니다 (기존 노드 또는 가장자리 정의 업데이트에서 자세히 설명).

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (Account, Person)
  EDGE TABLES (
    PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
      LABEL Owns,
    AccountTransferAccount
      SOURCE KEY (id) REFERENCES Account (id)
      DESTINATION KEY (to_id) REFERENCES Account (id)
      LABEL Transfers
  );

이제 그래프 데이터에서 전체 텍스트 검색을 사용할 수 있습니다.

검색 그래프 노드 속성

이 예에서는 그래프에서 노드를 검색하고 노드 간의 관계를 탐색하는 방법을 보여줍니다.

  1. 일부 텍스트 메시지로 Account.nick_name를 업데이트합니다.

    UPDATE Account SET nick_name = "Fund for vacation at the north pole" WHERE id = 7;
    UPDATE Account SET nick_name = "Fund -- thrill rides!" WHERE id = 16;
    UPDATE Account SET nick_name = "Rainy day fund for the things I still want to do" WHERE id = 20;
    
  2. SEARCH 함수를 사용하여 그래프에서 nick_name에 'rainy day' 또는 'vacation'이 포함된 Account 노드를 찾습니다. 그래프 탐색을 사용하여 해당 계정으로 송금된 금액을 찾습니다. 검색 관련성을 기준으로 일치 항목에 점수를 매깁니다. 관련성 내림차순으로 결과를 정렬하고 반환합니다. 동일한 검색 함수 호출에서 토큰의 불연결을 찾을 수 있습니다.

    GRAPH FinGraph
    MATCH (n:Account)<-[e:Transfers]-(:Account)
    WHERE SEARCH(n.nick_name_token, '"rainy day" | vacation')
    RETURN n.nick_name, e.amount AS amount_added
    ORDER BY SCORE(n.nick_name_token, '"rainy day" | vacation') DESC
    

    결과:

    nick_name                                             amount_added
    Rainy day fund for the things I still want to do      300
    Fund for vacation at the north pole                   500
    

검색 그래프 에지 속성

이 예에서는 그래프에서 특정 간선을 검색하는 방법을 보여줍니다.

  1. AccountTransferAccount.notes를 문자 메시지로 업데이트합니다.

    UPDATE AccountTransferAccount SET notes = 'for trip fund'
    WHERE id = 16 AND to_id = 20;
    UPDATE AccountTransferAccount SET notes = '&lt;trip&#39;s very fun!&gt;'
    WHERE id = 20 AND to_id = 7;
    UPDATE AccountTransferAccount SET notes = 'book fee'
    WHERE id = 20 AND to_id = 16;
    
  2. 전체 텍스트 검색을 사용하여 'trip'이 포함된 Transfers(이전) 에지를 찾습니다. 그래프 탐색을 사용하여 이러한 전송의 소스 및 대상 노드를 찾습니다.

    GRAPH FinGraph
    MATCH (a:Account)-[e:Transfers WHERE SEARCH(e.notes_token, 'trip')]->(b:Account)
    RETURN a.id AS src_id, b.id AS dst_id, e.notes
    

    결과:

    src_id  dst_id  notes
    
    20      7      &lt;trip&#39;s very fun!&gt;
    16      20     for trip fund
    

검색 함수는 텍스트에 HTML 태그가 있음에도 불구하고 첫 번째 결과를 올바르게 가져왔습니다.

다음 단계