1. Giới thiệu
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách thực hiện tìm kiếm kết hợp trong AlloyDB bằng cách sử dụng pgvector và chỉ mục Scalable Nearest Neighbor (ScaNN), kết hợp với khả năng tìm kiếm toàn văn bản của Apache Solr thông qua Foreign Data Wrapper (FDW). Bài thực hành này thuộc một bộ sưu tập bài thực hành dành riêng cho các tính năng AI của AlloyDB. Bạn có thể đọc thêm trên trang AI của AlloyDB trong tài liệu.
Apache Solr là một nền tảng tìm kiếm nguồn mở dành cho doanh nghiệp, được xây dựng trên Apache Lucene, được thiết kế để có khả năng tìm kiếm toàn bộ văn bản nhanh chóng, có thể mở rộng và có tính sẵn sàng cao. Việc tích hợp Solr với AlloyDB thông qua Trình bao bọc dữ liệu bên ngoài (FDW) cho phép người dùng truy vấn các chỉ mục Solr trực tiếp từ PostgreSQL cùng với các bảng cơ sở dữ liệu có cấu trúc. Để tìm hiểu thêm, hãy xem tài liệu về Apache Solr.
Điều kiện tiên quyết
- Có kiến thức cơ bản về Google Cloud Console
- Kỹ năng cơ bản về giao diện dòng lệnh và Google Shell
Kiến thức bạn sẽ học được
- Cách triển khai cụm AlloyDB và phiên bản chính
- Cách kết nối với AlloyDB từ máy ảo Google Compute Engine
- Cách tạo cơ sở dữ liệu và bật AI AlloyDB
- Cách tải dữ liệu vào cơ sở dữ liệu
- Cách sử dụng AlloyDB Studio
- Tạo các vectơ nhúng bằng Vertex AI
- Cách tạo chỉ mục vectơ ScaNN để tăng cường tìm kiếm vectơ
- Cách tạo Trình bao bọc dữ liệu bên ngoài (FDW) cho Apache Solr
- Thực hiện tìm kiếm kết hợp bằng cách kết hợp tìm kiếm ngữ nghĩa trong AlloyDB với tìm kiếm toàn bộ văn bản trong Solr.
Bạn cần có
- Tài khoản Google Cloud và dự án trên Google Cloud
- Một trình duyệt web như Chrome
2. Thiết lập và yêu cầu
Thiết lập dự án
Đăng nhập vào Google Cloud Console. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.
Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp.
- Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên đám mây của Google Cloud.
- Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trong một dự án hay không.
Bật tính năng thanh toán
Để bật tính năng thanh toán, bạn có 2 lựa chọn. Bạn có thể sử dụng tài khoản thanh toán cá nhân hoặc đổi tín dụng theo các bước sau.
Thiết lập tài khoản thanh toán cá nhân
Nếu thiết lập thông tin thanh toán bằng tín dụng Google Cloud, bạn có thể bỏ qua bước này.
Để thiết lập tài khoản thanh toán cá nhân, hãy truy cập vào đây để bật tính năng thanh toán trong Cloud Console.
Một số lưu ý:
- Việc hoàn thành bài tập thực hành này sẽ tốn ít hơn 3 USD cho các tài nguyên trên Cloud.
- Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
- Người dùng mới đủ điều kiện dùng thử miễn phí 300 USD.
Khởi động Cloud Shell
Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.
Cloud Shell là một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn các công cụ cần thiết.
- Nhấp vào Kích hoạt Cloud Shell ở đầu Cloud Console.
- Sau khi kết nối với Cloud Shell, hãy xác minh thông tin xác thực của bạn:
gcloud auth list - Xác nhận rằng dự án của bạn đã được định cấu hình:
gcloud config get project - Nếu dự án của bạn không được thiết lập như mong đợi, hãy thiết lập dự án:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện mọi thao tác trong lớp học lập trình này trong trình duyệt. Bạn không cần cài đặt bất cứ thứ gì.
3. Trước khi bắt đầu
Bật API
Kết quả:
Để sử dụng AlloyDB, Compute Engine, Dịch vụ mạng và Vertex AI, bạn cần bật các API tương ứng trong dự án trên đám mây của Google Cloud.
Bật API
Trong Cloud Shell trên thiết bị đầu cuối, hãy đảm bảo rằng bạn đã thiết lập mã dự án:
gcloud config set project [YOUR-PROJECT-ID]
Đặt biến môi trường PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
Bật tất cả các API cần thiết:
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com \
secretmanager.googleapis.com
Kết quả đầu ra dự kiến
student@cloudshell:~ (alloydb-hybrid-search)$ gcloud config set project alloydb-hybrid-search
[environment: untagged] Read more to tag: g.co/cloud/project-env-tag.
Updated property [core/project].
student@cloudshell:~ (alloydb-hybrid-search)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-32544]
student@cloudshell:~ (alloydb-hybrid-search)$ gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com \
secretmanager.googleapis.com
Operation "operations/acat.p2-350113473377-5ffc2f22-caa9-4857-b2f4-018657d8bf6e" finished successfully.
Giới thiệu về các API
- API AlloyDB (
alloydb.googleapis.com) cho phép bạn tạo, quản lý và mở rộng quy mô các cụm AlloyDB cho PostgreSQL. Đây là một dịch vụ cơ sở dữ liệu tương thích với PostgreSQL, được quản lý hoàn toàn và được thiết kế cho các tải công việc giao dịch và phân tích đòi hỏi khắt khe của doanh nghiệp. - Compute Engine API (
compute.googleapis.com) cho phép bạn tạo và quản lý máy ảo (VM), ổ đĩa liên tục và chế độ cài đặt mạng. Nền tảng này cung cấp nền tảng Cơ sở hạ tầng dưới dạng dịch vụ (IaaS) cốt lõi cần thiết để chạy các khối lượng công việc và lưu trữ cơ sở hạ tầng cơ bản cho nhiều dịch vụ được quản lý. - Cloud Resource Manager API (
cloudresourcemanager.googleapis.com) cho phép bạn quản lý siêu dữ liệu và cấu hình của dự án trên Google Cloud theo phương thức lập trình. Nhờ đó, bạn có thể sắp xếp tài nguyên, xử lý các chính sách Quản lý danh tính và quyền truy cập (IAM), cũng như xác thực các quyền trong hệ thống phân cấp dự án. - Service Networking API (
servicenetworking.googleapis.com) cho phép bạn tự động hoá việc thiết lập kết nối riêng tư giữa mạng Virtual Private Cloud (VPC) và các dịch vụ được quản lý của Google. Bạn phải thiết lập quyền truy cập bằng IP riêng cho các dịch vụ như AlloyDB để các dịch vụ này có thể giao tiếp an toàn với các tài nguyên khác của bạn. - Vertex AI API (
aiplatform.googleapis.com) cho phép các ứng dụng của bạn xây dựng, triển khai và mở rộng quy mô các mô hình học máy. Vertex AI cung cấp giao diện hợp nhất cho tất cả các dịch vụ AI của Google Cloud, bao gồm cả quyền truy cập vào các mô hình AI tạo sinh (như Gemini) và hoạt động huấn luyện mô hình tuỳ chỉnh. - Secret Manager API (
secretmanager.googleapis.com) là một dịch vụ quản lý thông tin xác thực và bí mật, cho phép bạn lưu trữ và quản lý dữ liệu nhạy cảm như khoá API, tên người dùng, mật khẩu, chứng chỉ, v.v.
Bạn có thể định cấu hình khu vực mặc định để sử dụng các mô hình nhúng Vertex AI (nếu muốn). Đọc thêm về các vị trí có Vertex AI. Trong ví dụ này, chúng ta sẽ sử dụng khu vực us-central1.
gcloud config set compute/region us-central1
4. Triển khai AlloyDB
Trước khi tạo một cụm AlloyDB, chúng ta cần có một dải IP riêng tư có sẵn trong VPC để thực thể AlloyDB trong tương lai sử dụng. Nếu chưa có, chúng ta cần tạo, chỉ định để các dịch vụ nội bộ của Google sử dụng. Sau đó, chúng ta sẽ có thể tạo cụm và phiên bản.
Tạo dải IP riêng tư
Chúng ta cần định cấu hình cấu hình Quyền truy cập vào dịch vụ riêng tư trong VPC cho AlloyDB. Giả định ở đây là chúng ta có mạng VPC "mặc định" trong dự án và mạng này sẽ được dùng cho mọi hành động.
Tạo dải IP riêng tư:
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
Tạo kết nối riêng tư bằng dải IP được phân bổ:
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
Sau khi kết nối, hãy cập nhật quan hệ ngang hàng để xuất các tuyến tuỳ chỉnh:
gcloud compute networks peerings update servicenetworking-googleapis-com \
--network=default \
--export-custom-routes
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@cloudshell:~ (alloydb-hybrid-search)$ gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
Created [https://www.googleapis.com/compute/v1/projects/alloydb-hybrid-search/global/addresses/psa-range].
student@cloudshell:~ (alloydb-hybrid-search)$ gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
Operation "operations/pssn.p24-350113473377-fadad49e-7e14-472a-8888-26951e40a1f7" finished successfully.
student@cloudshell:~ (alloydb-hybrid-search)$ gcloud compute networks peerings update servicenetworking-googleapis-com \
--network=default \
--export-custom-routes
Updated [https://www.googleapis.com/compute/v1/projects/alloydb-hybrid-search/global/networks/default].
Tạo cụm AlloyDB
Trong phần này, chúng ta sẽ tạo một cụm AlloyDB ở khu vực us-central1.
Xác định mật khẩu cho người dùng postgres. Bạn có thể tự xác định mật khẩu hoặc sử dụng một hàm ngẫu nhiên để tạo mật khẩu
export PGPASSWORD=`openssl rand -hex 12`
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@cloudshell:~ (alloydb-hybrid-search)$ export PGPASSWORD=`openssl rand -hex 12`
Ghi lại mật khẩu PostgreSQL để sử dụng sau này.
echo $PGPASSWORD
Sau này, bạn sẽ cần mật khẩu đó để kết nối với phiên bản dưới dạng người dùng postgres. Bạn nên sao chép mã này vào một nơi an toàn (ví dụ: trình quản lý mật khẩu).
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@cloudshell:~ (alloydb-hybrid-search)$ echo $PGPASSWORD <generated password>
Tạo Cụm AlloyDB
Xác định khu vực và tên cụm AlloyDB. Chúng ta sẽ sử dụng khu vực us-central1 và alloydb-hybrid-search làm tên cụm:
export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
Chạy lệnh để tạo cụm:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--database-version=POSTGRES_17
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@cloudshell:~ (alloydb-hybrid-search)$ export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
student@cloudshell:~ (alloydb-hybrid-search)$ gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--database-version=POSTGRES_17
Creating cluster...done.
Tạo một phiên bản chính AlloyDB cho cụm của chúng ta trong cùng một phiên Cloud Shell. Nếu bị ngắt kết nối, bạn sẽ cần xác định lại các biến môi trường của tên vùng và tên cụm.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
Kết quả đầu ra dự kiến trên bảng điều khiển:
admin_@cloudshell:~ (my-project-93954-gke)$ gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--availability-type ZONAL \
--cluster=$ADBCLUSTER
Operation ID: operation-1784244706986-656c2d7f3c8f2-59a9e52a-1e7b1b01
Creating instance...done.
5. Kết nối với AlloyDB
AlloyDB được triển khai bằng kết nối chỉ dành riêng tư, vì vậy, chúng ta cần một VM đã cài đặt ứng dụng PostgreSQL để làm việc với cơ sở dữ liệu. Chúng ta cũng sẽ dùng VM này để chạy một phiên bản Apache Solr.
Triển khai máy ảo GCE
Tạo một VM GCE trong cùng vùng và VPC với cụm AlloyDB, đảm bảo rằng ổ đĩa khởi động đủ lớn để chạy Solr. Ở đây, chúng ta chỉ định một ổ đĩa khởi động 20 GB trong cờ --create-disk.
Trong Cloud Shell, hãy thực thi:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,size=20,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@cloudshell:~ (alloydb-hybrid-search)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--network=default \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: X.X.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING
Cài đặt ứng dụng Postgres
Cài đặt phần mềm máy khách PostgreSQL trên máy ảo đã triển khai
Kết nối với máy ảo:
gcloud compute ssh instance-1 --zone=us-central1-a
Kết quả đầu ra dự kiến trên bảng điều khiển:
admin_@cloudshell:~ (my-project-93954-gke)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/alloydb-hybrid-search]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
Cài đặt lệnh chạy phần mềm bên trong máy ảo:
sudo apt-get update
sudo apt-get install --yes postgresql-client
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes postgresql-client Get:1 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B] Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B] Hit:3 https://deb.debian.org/debian bullseye InRelease Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB] Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B] Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB] Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB] ...redacted... Setting up postgresql-client (15+248+deb12u1) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u14) ...
Kết nối với phiên bản
Kết nối với phiên bản chính từ máy ảo bằng psql.
Trong cùng một thẻ Cloud Shell có phiên SSH đã mở đến VM instance-1.
Sử dụng giá trị mật khẩu AlloyDB (PGPASSWORD) đã ghi chú và mã nhận dạng cụm AlloyDB để kết nối với AlloyDB từ máy ảo GCE:
export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@instance-1:~$ export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (15.18 (Debian 15.18-0+deb12u1), server 17.9)
WARNING: psql major version 15, server major version 17.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
Đóng phiên psql:
exit
6. Chuẩn bị cơ sở dữ liệu
Chúng ta cần tạo một cơ sở dữ liệu, bật tính năng tích hợp Vertex AI, tạo các đối tượng cơ sở dữ liệu và nhập dữ liệu.
Cấp các quyền cần thiết cho AlloyDB
Thêm quyền Vertex AI vào tác nhân dịch vụ AlloyDB.
Mở một thẻ Cloud Shell khác bằng cách sử dụng dấu "+" ở trên cùng.

Trong thẻ cloud shell mới, hãy thực thi:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
Kết quả đầu ra dự kiến trên bảng điều khiển:
admin_@cloudshell:~ (my-project-93954-gke)$ PROJECT_ID=$(gcloud config get-value project) gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" Your active configuration is: [cloudshell-30137] Updated IAM policy for project [my-project-93954-gke]. bindings: - members: <redacted> version: 1
Đóng thẻ bằng cách nhấp vào "X" hoặc thực thi lệnh:
exit
Tạo cơ sở dữ liệu
Tạo một cơ sở dữ liệu có tên là quickstart.
Trong phiên máy ảo GCE, hãy thực thi:
Tạo cơ sở dữ liệu:
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db" CREATE DATABASE
Bật tính năng tích hợp Vertex AI
Bật tính năng tích hợp Vertex AI và các tiện ích pgvector trong cơ sở dữ liệu.
Trong máy ảo GCE, hãy thực thi:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE" psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector" NOTICE: extension "google_ml_integration" already exists, skipping CREATE EXTENSION CREATE EXTENSION
Nhập dữ liệu
Tải dữ liệu đã chuẩn bị xuống và nhập vào cơ sở dữ liệu mới.
Trong máy ảo GCE, hãy thực thi:
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
Kết quả đầu ra dự kiến trên bảng điều khiển:
student@instance-1:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header" gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header" gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header" SET SET SET SET SET set_config ------------ (1 row) SET SET SET SET SET SET CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE ALTER TABLE ALTER TABLE ALTER TABLE COPY 941 COPY 263861 COPY 4654
Tiếp theo, hãy đặt các cờ cơ sở dữ liệu cần thiết. Bạn có thể sử dụng bảng điều khiển web và quản lý cờ trong phiên bản chính hoặc sử dụng lệnh gcloud như sau:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
gcloud beta alloydb instances update $ADBCLUSTER-pr \
--database-flags google_ml_integration.enable_faster_embedding_generation=on,scann.enable_preview_features=on,google_ml_integration.enable_preview_ai_functions=on,google_ml_integration.enable_ai_query_engine=on \
--region=$REGION \
--cluster=$ADBCLUSTER \
--project=$PROJECT_ID \
--update-mode=FORCE_APPLY
Kết quả đầu ra dự kiến trên bảng điều khiển
student@cloudshell:~ (alloydb-hybrid-search)$ export PROJECT_ID=$(gcloud config get-value project) export REGION=us-central1 export ADBCLUSTER=alloydb-hybrid-search gcloud beta alloydb instances update $ADBCLUSTER-pr \ --database-flags google_ml_integration.enable_faster_embedding_generation=on,scann.enable_preview_features=on,google_ml_integration.enable_preview_ai_functions=on,google_ml_integration.enable_ai_query_engine=on \ --region=$REGION \ --cluster=$ADBCLUSTER \ --project=$PROJECT_ID \ --update-mode=FORCE_APPLY Your active configuration is: [cloudshell-30137] Operation ID: operation-1784245853151-656c31c44e12b-6084eb8b-d6611419
Việc bật cờ cơ sở dữ liệu yêu cầu khởi động lại phiên bản và sẽ mất vài phút. Sau khi hoàn tất, trạng thái của phiên bản AlloyDB sẽ là "Sẵn sàng".
7. Tạo vectơ nhúng
Sau khi nhập dữ liệu, chúng ta có các bảng sau: cymbal_products lưu trữ thông tin về sản phẩm, cymbal_inventory theo dõi kho hàng của từng mặt hàng ở mỗi cửa hàng và cymbal_stores là danh sách các cửa hàng. Để thực hiện tìm kiếm ngữ nghĩa trên các sản phẩm của mình, chúng ta cần tạo các vectơ nhúng cho nội dung mô tả sản phẩm bằng hàm initialize_embeddings. Chúng ta sẽ sử dụng tính năng tích hợp Vertex AI để tính toán dữ liệu vectơ dựa trên nội dung mô tả sản phẩm và thêm dữ liệu đó vào bảng. Bạn có thể đọc thêm về công nghệ được dùng trong tài liệu.
Để sử dụng tính năng tích hợp này, hãy kết nối với cơ sở dữ liệu bằng AlloyDB Studio hoặc sử dụng psql từ VM bằng IP của thực thể AlloyDB và mật khẩu postgres:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
Xác minh phiên bản của tiện ích google_ml_integration.
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
Phiên bản phải từ 1.5.2 trở lên. Sau đây là ví dụ về kết quả:
quickstart_db=> SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.5.9 (1 row)
Phiên bản mặc định phải là 1.5.2 trở lên, nhưng nếu phiên bản trên phiên bản của bạn cũ hơn thì có thể bạn cần cập nhật. Kiểm tra xem hoạt động bảo trì có bị vô hiệu hoá cho phiên bản này hay không.
Cài đặt tiện ích vectơ và tạo một cột mới để lưu trữ các mục nhúng trong cymbal_products
CREATE EXTENSION IF NOT EXISTS vector;
ALTER TABLE cymbal_products ADD COLUMN product_embedding vector(768);
Kết quả đầu ra dự kiến trên bảng điều khiển:
quickstart_db=> CREATE EXTENSION IF NOT EXISTS vector; ALTER TABLE cymbal_products ADD COLUMN product_embedding vector(768); NOTICE: extension "vector" already exists, skipping CREATE EXTENSION ALTER TABLE
Chúng tôi sẽ sử dụng tính năng tạo vectơ nhúng hàng loạt để cải thiện hiệu quả. Bạn có thể đọc thêm về các lựa chọn và kỹ thuật tạo vectơ nhúng khác nhau trong hướng dẫn. Trước đây, chúng tôi đã bật cờ google_ml_integration.enable_faster_embedding_generation để cho phép tạo hàng loạt các mục nhúng.
Cuối cùng, chúng ta cũng muốn các mục nhúng làm mới khi các giá trị cột bị thay đổi bằng cách thêm đối số incremental_refresh_mode vào lệnh gọi hàm. Điều này làm tăng tải cho cơ sở dữ liệu của chúng tôi, nhưng đây là một sự đánh đổi mà chúng tôi thực hiện để tự động đồng bộ hoá các mục nhúng với nội dung. Nếu muốn cập nhật các mục nhúng theo cách thủ công, bạn có thể xem hướng dẫn trong tài liệu.
Giờ đây, khi kết hợp tất cả và tạo các mục nhúng, chúng ta sẽ dùng hàm initialize_embeddings và truyền batch_size là 50 làm gợi ý về lô và đặt incremental_refresh_mode thành transactional
CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'cymbal_products',
content_column => 'product_description',
embedding_column => 'product_embedding',
batch_size => 50,
incremental_refresh_mode => 'transactional'
);
Và giờ đây, nếu chúng ta chèn một hàng mới vào bảng có giá trị NULL cho cột product_embedding
INSERT INTO "cymbal_products" ("uniq_id", "crawl_timestamp", "product_url", "product_name", "product_description", "list_price", "sale_price", "brand", "item_number", "gtin", "package_size", "category", "postal_code", "available", "product_embedding") VALUES ('fd604542e04b470f9e6348e640cff794', NOW(), 'https://example.com/new_product', 'New Cymbal Product', 'This is a new cymbal product description.', 199.99, 149.99, 'Example Brand', 'EB123', '1234567890', 'Single', 'Cymbals', '12345', TRUE, NULL);
Giờ đây, khi truy vấn hàng mà chúng ta vừa chèn, chúng ta sẽ thấy cột product_embedding được tự động cập nhật.
SELECT uniq_id, (product_embedding::real[])[1:5] as product_embedding FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';
Kết quả đầu ra sẽ có dạng như sau:
quickstart_db=> SELECT uniq_id,(product_embedding::real[])[1:5] as product_embedding FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';
uniq_id | product_embedding
----------------------------------+---------------------------------------------------------------
fd604542e04b470f9e6348e640cff794 | {0.015003494,-0.005349732,-0.059790313,-0.0087091,-0.0271452}
(1 row)
8. Tạo chỉ mục vectơ
Để cải thiện hiệu suất tìm kiếm vectơ, chúng tôi sẽ thêm một chỉ mục ScaNN.
Tạo chỉ mục ScaNN
Để tạo chỉ mục SCANN, chúng ta cần bật thêm một tiện ích. Tiện ích alloydb_scann cung cấp một giao diện để làm việc với chỉ mục vectơ loại ANN bằng cách sử dụng thuật toán ScaNN của Google.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Kết quả đầu ra dự kiến:
quickstart_db=> CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION
Bạn có thể tạo chỉ mục ở chế độ THỦ CÔNG hoặc TỰ ĐỘNG. Chế độ THỦ CÔNG được bật theo mặc định và bạn có thể tạo chỉ mục cũng như duy trì chỉ mục đó như bất kỳ chỉ mục nào khác. Nhưng nếu bật chế độ TỰ ĐỘNG, bạn có thể tạo chỉ mục mà không cần bảo trì. Bạn có thể đọc chi tiết về tất cả các lựa chọn trong tài liệu. Trong trường hợp này, chúng ta không có đủ hàng để tạo chỉ mục ở chế độ TỰ ĐỘNG, vì vậy, chúng ta sẽ tạo chỉ mục ở chế độ THỦ CÔNG và thêm các tham số điều chỉnh. Bạn có thể đọc về việc điều chỉnh các tham số chỉ mục trong tài liệu.
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
USING scann (product_embedding cosine)
WITH (mode='MANUAL', num_leaves=31, max_num_levels = 2);
Kết quả đầu ra dự kiến:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products USING scann (product_embedding cosine) WITH (num_leaves=31, max_num_levels = 2); CREATE INDEX quickstart_db=>
Kiểm tra việc sử dụng chỉ mục
Giờ đây, chúng ta có thể chạy truy vấn tìm kiếm vectơ ở chế độ EXPLAIN và xác minh xem chỉ mục có đang được sử dụng hay không.
EXPLAIN (analyze)
WITH trees as (
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
cp.uniq_id as product_id
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
(cp.product_embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
Kết quả đầu ra dự kiến (được chỉnh sửa để cho rõ ràng hơn):
... Aggregate (cost=16.59..16.60 rows=1 width=32) (actual time=2.875..2.877 rows=1 loops=1) -> Subquery Scan on trees (cost=8.42..16.59 rows=1 width=142) (actual time=2.860..2.862 rows=1 loops=1) -> Limit (cost=8.42..16.58 rows=1 width=158) (actual time=2.855..2.856 rows=1 loops=1) -> Nested Loop (cost=8.42..6489.19 rows=794 width=158) (actual time=2.854..2.855 rows=1 loops=1) -> Nested Loop (cost=8.13..6466.99 rows=794 width=938) (actual time=2.742..2.743 rows=1 loops=1) -> Index Scan using cymbal_products_embeddings_scann on cymbal_products cp (cost=7.71..111.99 rows=876 width=934) (actual time=2.724..2.724 rows=1 loops=1) Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,-0.00355923,0.0055611245,0.015985578,...<redacted>...5685,-0.03914233,-0.018452475,0.00826032,-0.07372604]'::vector) ...
Từ đầu ra, chúng ta có thể thấy rõ rằng truy vấn đang sử dụng "Index Scan using cymbal_products_embeddings_scann on cymbal_products".
9. Tạo một phiên bản Solr
Chúng tôi sẽ sử dụng Apache Solr cho phần tìm kiếm toàn văn (FTS) của tính năng tìm kiếm kết hợp. Trong bước này, bạn sẽ triển khai một phiên bản Solr độc lập trong VM mà bạn đã tạo trước đó.
Để bảo mật quyền truy cập vào Solr, chúng ta sẽ bật Phương thức xác thực cơ bản. Chúng ta sẽ thực hiện việc này bằng cách cung cấp một tệp cấu hình security.json, gắn tệp đó và khởi động vùng chứa Solr docker.
Kết nối SSH vào VM và cài đặt Docker:
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Giờ đây, bạn có thể sửa đổi lệnh docker mà người dùng sẽ chạy:
sudo usermod -aG docker $USER
newgrp docker
Giờ đây, hãy tạo tệp security.json để bật tính năng Xác thực cơ bản bằng tên người dùng solr và mật khẩu SolrRocks.
nano security.json
Trong tệp này, hãy dán đoạn mã JSON sau:
{
"authentication": {
"blockUnknown": true,
"class": "solr.BasicAuthPlugin",
"credentials": {
"solr": "IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="
}
},
"authorization": {
"class": "solr.RuleBasedAuthorizationPlugin",
"permissions": [
{ "name": "security-edit", "role": "admin" }
],
"user-role": { "solr": "admin" }
}
}
Lưu và thoát khỏi nano (Ctrl + O, Enter, Ctrl + X).
Khởi động vùng chứa Solr docker bằng docker run và gắn tệp security.json vào vùng chứa:
docker run -d -p 8983:8983 --name solr --user root -v "$(pwd)/security.json:/var/solr/data/security.json" solr:9 -c -force
Xác minh rằng vùng chứa đang chạy:
docker ps
Kết quả đầu ra dự kiến:
student@instance-1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90db3c73835e solr:9 "docker-entrypoint.s..." 7 seconds ago Up 3 seconds 0.0.0.0:8983->8983/tcp, [::]:8983->8983/tcp solr
Cho Solr vài giây để khởi động, sau đó tạo một tập hợp mới có tên là solrindexdemo bằng cách truy cập vào Solr API bằng thông tin xác thực Basic Auth:
curl --user solr:SolrRocks -X POST "http://localhost:8983/solr/admin/collections?action=CREATE&name=solrindexdemo&numShards=1&replicationFactor=1"
Kết quả đầu ra dự kiến:
student@instance-1:~$ curl --user solr:SolrRocks -X POST "http://localhost:8983/solr/admin/collections?action=CREATE&name=solrindexdemo&numShards=1&replicationFactor=1"
{
"responseHeader":{
"status":0,
"QTime":3586
},
"success":{
"172.17.0.2:8983_solr":{
"responseHeader":{
"status":0,
"QTime":2405
},
"core":"solrindexdemo_shard1_replica_n1"
}
},
"warning":"Using _default configset. Data driven schema functionality is enabled by default, which is NOT RECOMMENDED for production use. To turn it off: curl http://{host:port}/solr/solrindexdemo/config -d '{\"set-user-property\": {\"update.autoCreateFields\":\"false\"}}'"
Bây giờ, chúng ta sẽ điền thông tin mô tả và tên sản phẩm vào phiên bản Solr. Sao chép tệp CSV sản phẩm từ bộ nhớ đám mây vào máy ảo.
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
Bây giờ, hãy tạo một tập lệnh Python để trích xuất tệp CSV và định dạng dữ liệu thành một danh sách JSON để cập nhật hàng loạt.
nano convert.py
Dán nội dung sau đây vào tệp:
import csv
import json
# Configuration
input_file = 'cymbal_products.csv'
output_file = 'products.json'
def convert():
try:
with open(input_file, mode='r', encoding='utf-8') as f_in, \
open(output_file, mode='w', encoding='utf-8') as f_out:
reader = csv.DictReader(f_in)
products = []
for row in reader:
products.append({
"id": row['uniq_id'].strip(),
"product_name": row['product_name'].strip(),
"product_description": row['product_description'].strip()
})
json.dump(products, f_out, indent=2)
print(f"Success: Processed {len(products)} products.")
print(f"Output saved to: {output_file}")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
convert()
Lưu tệp và kích hoạt tệp đó:
python3 convert.py
Kết quả đầu ra dự kiến:
admin_gopalbhutada_altostrat_com@instance-1:~$ python3 convert.py Success: Processed 941 products. Output saved to: products.json
Giờ đây, hãy gửi dữ liệu JSON đến Apache Solr bằng trình xử lý cập nhật:
curl --user solr:SolrRocks -X POST -H 'Content-Type: application/json' \
'http://localhost:8983/solr/solrindexdemo/update?commit=true' \
--data-binary "@products.json"
Kết quả đầu ra dự kiến:
admin_gopalbhutada_altostrat_com@instance-1:~$ curl --user solr:SolrRocks -X POST -H 'Content-Type: application/json' \
'http://localhost:8983/solr/solrindexdemo/update?commit=true' \
--data-binary "@products.json"
{
"responseHeader":{
"rf":1,
"status":0,
"QTime":3220
}
}
Bây giờ, chúng ta cần tạo một khoá bí mật trong Secret Manager để lưu trữ thông tin xác thực Solr. Vì AlloyDB liên kết với FDW tìm kiếm bên ngoài bằng cách sử dụng các giá trị username:password được mã hoá base64 cho phương thức Xác thực cơ bản, nên trước tiên, hãy lấy chuỗi được mã hoá base64 cho solr:SolrRocks:
echo -n "solr:SolrRocks" | base64
Kết quả:
admin_gopalbhutada_altostrat_com@instance-1:~$ echo -n "solr:SolrRocks" | base64 c29scjpTb2xyUm9ja3M=
Tạo một khoá bí mật trong Google Secret Manager bằng thông tin đăng nhập được mã hoá base64 này. Trong Cloud Shell, hãy chạy lệnh sau:
echo -n "c29scjpTb2xyUm9ja3M=" | \
gcloud secrets create solr-credentials \
--replication-policy="automatic" \
--data-file=-
10. Tạo trình bao bọc dữ liệu bên ngoài trong AlloyDB
Thời lượng 10:00
Để truy vấn dữ liệu được lưu trữ trong Apache Solr từ AlloyDB, chúng ta phải tạo một Trình bao bọc dữ liệu bên ngoài (FDW) cho Solr và một bảng bên ngoài. Trước đây, bạn đã lưu trữ thông tin đăng nhập Solr trong Secret Manager. Để AlloyDB truy cập vào khoá bí mật, hãy cấp cho tài khoản dịch vụ quyền cần thiết.
Trong Cloud Shell, hãy cấp cho tài khoản dịch vụ quyền truy cập vào khoá bí mật solr-credentials:
gcloud secrets add-iam-policy-binding solr-credentials \
--member="serviceAccount:service-$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
Kết quả đầu ra dự kiến:
admin_@cloudshell:~ (my-project-93954-gke)$ gcloud secrets add-iam-policy-binding solr-credentials \
--member="serviceAccount:service-$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
Your active configuration is: [cloudshell-13031]
Updated IAM policy for secret [solr-credentials].
bindings:
- members:
- serviceAccount:service-350113473377@gcp-sa-alloydb.iam.gserviceaccount.com
role: roles/secretmanager.secretAccessor
etag: BwZWyKlkx6Q=
version: 1
Kết nối với cơ sở dữ liệu bằng AlloyDB Studio (hoặc dùng psql để kết nối từ VM). Đăng nhập vào quickstart_db với tư cách là người dùng postgres.
Bật tiện ích FDW:
CREATE EXTENSION IF NOT EXISTS external_search_fdw;
Kết quả đầu ra dự kiến:
CREATE EXTENSION
Nhận tham số kết nối
Trước khi định cấu hình máy chủ dữ liệu bên ngoài trong AlloyDB, bạn cần có địa chỉ IP nội bộ của VM (nơi Solr đang chạy) và đường dẫn bí mật.
Để in IP nội bộ của VM, hãy chạy lệnh sau trong Cloud Shell:
gcloud compute instances describe instance-1 \
--zone=us-central1-a \
--format="value(networkInterfaces[0].networkIP)"
Kết quả đầu ra dự kiến:
10.X.X.X
Để in đường dẫn tài nguyên bí mật trong Secret Manager, hãy chạy lệnh:
gcloud secrets describe solr-credentials --format="value(name)"
Kết quả đầu ra dự kiến:
projects/<project_id>/secrets/solr-credentials
Để truy cập vào Apache Solr, hãy tạo một máy chủ dữ liệu bên ngoài. Thay thế và trong truy vấn bên dưới bằng các giá trị mà bạn đã truy xuất. Đảm bảo bạn thêm /versions/latest vào đường dẫn bí mật để lấy phiên bản bí mật gần đây nhất:
CREATE SERVER solr_demo_server
FOREIGN DATA WRAPPER external_search_fdw
OPTIONS(
server 'http://<VM_INTERNAL_IP_ADDRESS>:8983',
search_provider 'solr',
auth_mode 'secret_manager',
auth_method 'Basic',
secret_path '<SECRET_PATH>/versions/latest'
);
Kết quả đầu ra dự kiến:
CREATE SERVER
Tiếp theo, hãy xác định bảng bên ngoài. Sau siêu dữ liệu, hãy cung cấp định nghĩa giản đồ trường Solr để khớp với dữ liệu đã tải trước đó. Trong bảng từ xa, hãy chỉ định tên của bộ sưu tập Solr.
CREATE FOREIGN TABLE solrindexdemo (
metadata external_search_fdw_schema.OpaqueMetadata,
id TEXT,
product_name TEXT,
product_description TEXT
)
SERVER solr_demo_server
OPTIONS(
remote_table_name 'solrindexdemo'
);
Tạo một mối liên kết người dùng cho máy chủ:
CREATE USER MAPPING FOR CURRENT_USER SERVER solr_demo_server;
Giờ đây, bạn có thể kiểm thử bảng bên ngoài:
SELECT id, product_name
FROM solrindexdemo
ORDER BY metadata <@> 'product_description:cherry' DESC
limit 10;
Kết quả đầu ra dự kiến:
"id","product_name" "d536e9e823296a2eba198e52dd23e712","Cherry Tree" "390cf08feac229e7b752709fd1f943b3","Woven Round Placemat, Set of Twelve, Grass" "2c9aa7ac98c30abf78dd9c62a68a34e6","48 Scented Wax Melts Wax Cubes: Jelly Belly Jelly Beans Candy Bulk Soy Wax Melts For Candle Warmer, Wax Warmers, Wax Melt Warmers In 8 Pack Set"
11. Sử dụng tính năng Tìm kiếm kết hợp
Thời lượng 10:00
Giờ đây, khi mọi thứ đã được thiết lập, chúng ta có thể sử dụng hàm ai.hybrid_search() để kết hợp tìm kiếm vectơ và tìm kiếm toàn văn. Bạn có thể đọc thêm về tính năng tìm kiếm kết hợp trong tài liệu. Khi sử dụng tính năng tìm kiếm kết hợp, theo mặc định, kết quả truy vấn sẽ sử dụng thuật toán Reciprocal Rank Fusion (Kết hợp thứ hạng tương hỗ) để sắp xếp thứ hạng kết quả từ nhiều truy vấn. Trước tiên, hãy thử tìm kiếm vectơ và tìm kiếm kết hợp một cách độc lập để phân tích sự khác biệt giữa chúng.
Truy vấn sau đây thực hiện tìm kiếm vectơ để tìm các sản phẩm tương tự như quả anh đào. Mảng này cung cấp một danh sách các lượt tìm kiếm cần thực hiện. Trong trường hợp này, chúng ta chỉ sử dụng tính năng tìm kiếm vectơ, nhưng sau này chúng ta sẽ cung cấp cả vectơ và FTS.
SELECT id, score, cymbal_products.product_name, cymbal_products.product_description
FROM ai.hybrid_search(
ARRAY[
'{
"data_type": "vector",
"table_name": "cymbal_products",
"key_column": "uniq_id",
"vec_column": "product_embedding",
"distance_operator": "public.<=>",
"limit": 3,
"query_vector": "ai.embedding(''text-embedding-005'', ''cherry'')::vector"
}'::JSONB
]
) JOIN cymbal_products ON id = cymbal_products.uniq_id;
Trong kết quả, cây anh đào là kết quả đầu tiên, nhưng hãy lưu ý rằng hai kết quả tiếp theo cũng là cây ăn quả. Điều này là do khi sử dụng tính năng tìm kiếm vectơ trong cột product_description, chúng tôi sẽ tìm thấy các kết quả khớp ngữ nghĩa với điều kiện tìm kiếm của mình.
"id","score","product_name","product_description" "d536e9e823296a2eba198e52dd23e712","0.01639344262295082","Cherry Tree","This is a beautiful cherry tree that will produce delicious cherries. It is an deciduous tree that grows to be about 15 feet tall. The leaves are dark green in the summer and turn a beautiful red in the fall. Cherry trees are known for their beauty and their ability to provide shade and privacy. Cherry trees prefer a cool, moist climate and sandy soil. They are best suited for USDA zones 4-9." "b70c44b1a38c0a2329fa583c9109a80f","0.016129032258064516","Peach Tree","This is a beautiful peach tree that will produce delicious peaches. It is an evergreen tree that grows to be about 20 feet tall. The leaves are dark green in the summer and turn a beautiful yellow in the fall. Peach trees are known for their beauty and their ability to provide shade and privacy. Peach trees prefer a cool, moist climate and sandy soil. They are best suited for USDA zones 2-9." "23e41a71d63d8bbc9bdfa1d118cfddc5","0.015873015873015872","Apple Tree","This is a beautiful apple tree that will produce delicious apples. It is a deciduous tree that grows to be about 30 feet tall. The leaves are dark green in the summer and turn a beautiful red, orange, and yellow in the fall. Apple trees are known for their strength and durability. They are also a popular choice for shade trees. Apple trees prefer a cool, moist climate and loamy soil. They are best suited for USDA zones 4-8."
Để thực hiện tìm kiếm toàn văn bằng Apache Solr FDW, hãy chạy truy vấn sau:
SELECT id, score, cymbal_products.product_name, cymbal_products.product_description
FROM ai.hybrid_search(
ARRAY[
'{
"limit": 3,
"data_type": "external_search_fdw",
"table_name": "solrindexdemo",
"key_column": "id",
"query_text_input": "product_description:cherry"
}'::JSONB
]
) JOIN cymbal_products ON id = cymbal_products.uniq_id;
Lưu ý trong kết quả vì tính năng tìm kiếm toàn văn sử dụng tính năng so khớp mã thông báo, nên kết quả sẽ trả về mọi nội dung có chứa từ "cherry" trong nội dung mô tả sản phẩm.
"id","score","product_name","product_description" "d536e9e823296a2eba198e52dd23e712","0.01639344262295082","Cherry Tree","This is a beautiful cherry tree that will produce delicious cherries. It is an deciduous tree that grows to be about 15 feet tall. The leaves are dark green in the summer and turn a beautiful red in the fall. Cherry trees are known for their beauty and their ability to provide shade and privacy. Cherry trees prefer a cool, moist climate and sandy soil. They are best suited for USDA zones 4-9." "390cf08feac229e7b752709fd1f943b3","0.016129032258064516","Woven Round Placemat, Set of Twelve, Grass","...These placemats are great for special occasions and holidays, but are also perfect to accessorize your everyday place settings.|Measurements. 15-inch round diameter is the perfect size for most table sizes and shapes.|Pop Colors. Choose from 7 pop woven color placemats including: Black, Cherry, Grass, Taupe, Navy, Sun and Graphite." "2c9aa7ac98c30abf78dd9c62a68a34e6","0.015873015873015872","48 Scented Wax Melts Wax Cubes: Jelly Belly Jelly Beans Candy Bulk Soy Wax Melts For Candle Warmer, Wax Warmers, Wax Melt Warmers In 8 Pack Set","...From These Flavors: Lemon Drop, Mixed Berry Smoothie, Sizzling Cinnamon, Crushed Pineapple, Juicy Pear, Cotton Candy, Toasted Marshmallow, French Vanilla, Watermelon, Red Apple, Very Cherry, Buttered Popcorn..."
Giờ đây, bạn có thể kết hợp cả tìm kiếm ngữ nghĩa và FTS để nhận được kết quả có ý nghĩa hơn. Giả sử chúng ta muốn tìm một cái cây có thể cao hơn một ngôi nhà và chúng ta muốn cây đó đến từ California. Chúng tôi chia nhỏ cụm từ tìm kiếm để tận dụng ý định ngữ nghĩa thay vì so khớp theo nghĩa đen. Tính năng tìm kiếm vectơ xử lý phần mô tả: "cây có thể cao hơn một ngôi nhà" vì tính năng này hiểu được khái niệm về quy mô mà không cần từ khoá chính xác. Trong khi đó, tính năng tìm kiếm toàn văn bản sẽ xử lý "California" dưới dạng một bộ lọc nghiêm ngặt để đảm bảo chúng ta nhận được kết quả khớp chính xác về địa lý thay vì chỉ là một kết quả tương tự về mặt khái niệm.
SELECT id, score, cymbal_products.product_name, cymbal_products.product_description
FROM ai.hybrid_search(
ARRAY[
'{
"data_type": "vector",
"table_name": "cymbal_products",
"key_column": "uniq_id",
"vec_column": "product_embedding",
"distance_operator": "public.<=>",
"limit": 3,
"query_vector": "ai.embedding(''text-embedding-005'', ''tree that can grow taller than a house'')::vector"
}'::JSONB,
'{
"limit": 3,
"data_type": "external_search_fdw",
"table_name": "solrindexdemo",
"key_column": "id",
"query_text_input": "product_description:California"
}'::JSONB
]
) JOIN cymbal_products ON id = cymbal_products.uniq_id;
Kết quả dự kiến:
"id","score","product_name","product_description" "a589fd36a8a20fd9472d2403d6ed692a","0.00819672631147241","California Redwood","This is a beautiful redwood tree that can grow to be over 300 feet tall. It is an evergreen tree that grows in the coastal forests of California. Redwoods are known for their beauty and their strength. They are best suited for USDA zones 7-10." "ef9432802da24041594c2cf368dfb4d2","0.008064521129029258","Madrone","This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an evergreen tree that grows in the coastal forests of California. Madronas are known for their beauty and their bark. They are best suited for USDA zones 7-10." "1360d8642bc218e4ea28e9c32b2e1721","0.007936512936504936","California Sycamore","This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is an deciduous tree that grows in the valleys and foothills of California. California sycamores are known for their beauty and their shade. They are best suited for USDA zones 7-10."
12. Dọn dẹp môi trường
Huỷ các thực thể và cụm AlloyDB khi bạn hoàn tất lớp học.
Xoá cụm AlloyDB và tất cả các phiên bản
Nếu bạn đã dùng phiên bản dùng thử của AlloyDB. Đừng xoá cụm dùng thử nếu bạn có kế hoạch kiểm thử các phòng thí nghiệm và tài nguyên khác bằng cụm dùng thử. Bạn sẽ không thể tạo một cụm thử nghiệm khác trong cùng một dự án.
Cụm bị huỷ bằng lựa chọn bắt buộc, thao tác này cũng sẽ xoá tất cả các phiên bản thuộc cụm.
Trong cloud shell, hãy xác định các biến dự án và môi trường nếu bạn đã bị ngắt kết nối và mất tất cả các chế độ cài đặt trước đó:
gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-hybrid-search
export PROJECT_ID=$(gcloud config get-value project)
Xoá cụm:
gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
Kết quả đầu ra dự kiến trên bảng điều khiển:
admin_@cloudshell:~ (my-project-93954-gke)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force All of the cluster data will be lost when the cluster is deleted. Do you want to continue (Y/n)? Y Operation ID: operation-1784270790060-656c8ea9fea06-1b93001f-846543e0 Deleting cluster...done.
Xoá bản sao lưu AlloyDB
Xoá tất cả các bản sao lưu AlloyDB cho cụm:
for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Kết quả đầu ra dự kiến trên bảng điều khiển:
admin_@cloudshell:~ (my-project-93954-gke)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done Operation ID: operation-1784271231983-656c904f71e05-1389a145-f101ceee Deleting backup...done.
Giờ đây, chúng ta có thể huỷ VM
Xoá máy ảo GCE
Trong Cloud Shell, hãy thực thi:
export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
Kết quả đầu ra dự kiến trên bảng điều khiển:
admin_@cloudshell:~ (my-project-93954-gke)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
Deleted
13. Xin chúc mừng
Chúc mừng bạn đã hoàn thành lớp học lập trình này!
Nội dung đã đề cập
- Cách triển khai cụm AlloyDB và phiên bản chính
- Cách kết nối với AlloyDB từ máy ảo Google Compute Engine
- Cách tạo cơ sở dữ liệu và bật AI AlloyDB
- Cách tải dữ liệu vào cơ sở dữ liệu
- Cách sử dụng AlloyDB Studio
- Tạo các vectơ nhúng bằng Vertex AI
- Cách tạo chỉ mục vectơ ScaNN để tăng cường tìm kiếm vectơ
- Cách tạo Trình bao bọc dữ liệu bên ngoài (FDW) cho Apache Solr
- Thực hiện tìm kiếm kết hợp bằng cách kết hợp tìm kiếm ngữ nghĩa trong AlloyDB với tìm kiếm toàn bộ văn bản trong Solr.
Các bước tiếp theo
Bạn có thể khám phá thêm các lớp học lập trình về AlloyDB trên trang web chính thức về lớp học lập trình.postgresql).