Tạo giao diện tìm kiếm bằng Query API (API Truy vấn)

API Truy vấn cung cấp các phương thức tìm kiếm và đề xuất để tạo giao diện tìm kiếm hoặc nhúng kết quả tìm kiếm trong một ứng dụng.

Đối với các ứng dụng web có yêu cầu tối thiểu, hãy cân nhắc sử dụng tiện ích tìm kiếm. Để biết thêm thông tin, hãy xem phần Tạo giao diện tìm kiếm bằng tiện ích tìm kiếm

Xây dựng giao diện tìm kiếm

Bạn cần thực hiện một số bước để tạo giao diện tìm kiếm tối giản:

  1. Định cấu hình ứng dụng tìm kiếm
  2. Tạo thông tin xác thực OAuth cho ứng dụng
  3. Truy vấn chỉ mục
  4. Hiển thị kết quả truy vấn

Bạn có thể nâng cao giao diện tìm kiếm hơn nữa bằng các tính năng như phân trang, sắp xếp, lọc, phân tích và tự động đề xuất.

Định cấu hình ứng dụng tìm kiếm

Bạn phải tạo ít nhất một ứng dụng tìm kiếm để liên kết với từng giao diện tìm kiếm mà bạn tạo. Ứng dụng tìm kiếm cung cấp các tham số mặc định cho một truy vấn, chẳng hạn như nguồn dữ liệu cần sử dụng, thứ tự sắp xếp, bộ lọc và phương diện cần yêu cầu. Nếu cần, bạn có thể ghi đè các tham số này bằng API truy vấn.

Để biết thêm thông tin về các ứng dụng tìm kiếm, hãy tham khảo bài viết Tuỳ chỉnh trải nghiệm tìm kiếm trong Cloud Search.

Tạo thông tin xác thực OAuth cho ứng dụng

Ngoài các bước trong phần Thiết lập quyền truy cập vào API Google Cloud Search, bạn cũng phải tạo thông tin xác thực OAuth cho ứng dụng web. Loại thông tin xác thực mà bạn tạo phụ thuộc vào ngữ cảnh sử dụng API.

Sử dụng thông tin xác thực để thay mặt người dùng yêu cầu cấp quyền. Sử dụng phạm vi https://www.googleapis.com/auth/cloud_search.query khi yêu cầu uỷ quyền.

Để biết thêm thông tin về các tuỳ chọn OAuth và thư viện ứng dụng, hãy xem bài viết về [Google Identity Platform](https://developers.google.com/identity/choose-auth{: .external target="_blank"}.

Truy vấn chỉ mục

Sử dụng phương thức search để tìm kiếm trong chỉ mục.

Mỗi yêu cầu phải bao gồm hai phần thông tin: một query văn bản để so khớp các mục và một searchApplicationId xác định mã nhận dạng để ứng dụng tìm kiếm sử dụng.

Đoạn mã sau đây cho thấy một truy vấn đến nguồn dữ liệu phim cho bộ phim Titanic:

{
  "query": "titanic",
  "requestOptions": {
    "searchApplicationId": "searchapplications/<search_app_id>"
  },
}

Hiển thị kết quả truy vấn

Tối thiểu, giao diện tìm kiếm sẽ hiển thị mục title cũng như đường liên kết đến mục ban đầu. Bạn có thể tăng cường khả năng hiển thị kết quả tìm kiếm bằng cách tận dụng thông tin bổ sung có trong kết quả tìm kiếm, chẳng hạn như đoạn trích và siêu dữ liệu.

Xử lý kết quả bổ sung

Theo mặc định, Cloud Search sẽ trả về kết quả bổ sung khi không có đủ kết quả cho cụm từ tìm kiếm của người dùng. Trường queryInterpretation trong phản hồi cho biết thời điểm trả về kết quả bổ sung. Nếu chỉ trả về kết quả bổ sung, InterpretationType sẽ được đặt thành REPLACE. Nếu một số kết quả cho truy vấn ban đầu được trả về cùng với kết quả bổ sung, thì InterpretationType được đặt thành BLEND. Trong cả hai trường hợp, QueryInterpretation.Reason = NOT_ENOUGH_RESULTS_FOUND_FOR_USER_QUERY.

Khi một số kết quả bổ sung được trả về, hãy cân nhắc cung cấp văn bản để cho biết kết quả bổ sung đã được trả về. Ví dụ: trong trường hợp REPLACE, bạn có thể hiển thị chuỗi "Tìm kiếm của bạn cho cụm từ tìm kiếm ban đầu không khớp với kết quả nào. Đang hiển thị kết quả cho các cụm từ tìm kiếm tương tự".

Trong trường hợp BLEND, bạn có thể hiển thị chuỗi "Tìm kiếm của bạn cho cụm từ tìm kiếm ban đầu không khớp với đủ kết quả. Bao gồm cả kết quả cho các cụm từ tìm kiếm tương tự."

Xử lý kết quả về người

Cloud Search trả về hai loại "kết quả về người": tài liệu liên quan đến một người có tên được dùng trong truy vấn và thông tin nhân viên của một người có tên được dùng trong truy vấn. Loại kết quả sau là một hàm của tính năng Tìm kiếm người dùng trên Tìm kiếm trên đám mây và bạn có thể tìm thấy kết quả cho truy vấn như vậy trong trường structuredResults của phản hồi API truy vấn:

{
  "results": [...],
  "structuredResults": [{
    "person": {...}
  }]
}

So khớp nhân viên cấp dưới trực tiếp

So khớp nhân viên cấp dưới trực tiếp là một tính năng Tìm kiếm người dùng của Cloud Search, cho phép người dùng xem nhân viên cấp dưới trực tiếp của một người trong tổ chức của họ. Kết quả có trong trường structuredResults.

Đối với các truy vấn về người quản lý hoặc nhân viên cấp dưới trực tiếp của một người, phản hồi sẽ có một assistCardProtoHolder trong structuredResults. assistCardProtoHolder có một trường tên là cardType sẽ bằng với RELATED_PEOPLE_ANSWER_CARD. assistCardProtoHolder chứa một thẻ có tên là relatedPeopleAnswerCard chứa phản hồi thực tế. Tập hợp này chứa subject (người được đưa vào truy vấn) và relatedPeople là tập hợp những người liên quan đến chủ đề. Trường relationType trả về giá trị MANAGER hoặc DIRECT_REPORTS.

Mã sau đây cho thấy một phản hồi mẫu cho truy vấn khớp báo cáo trực tiếp:

{
  "results": [],
  "structuredResults": [{
    "assistCardProtoHolder": {
      "extensions": {
        "@type": "type.googleapis.com/enterprise.topaz.sidekick.AssistCardProto",
        "cardMetadata": {
          "cardCategory": "ANSWER"
        },
        "cardType": "RELATED_PEOPLE_ANSWER_CARD",
        "relatedPeopleAnswerCard": {
          "subject": {
            "email": "AdamStanford@psincs-test01.newjnj.com",
            "displayName": "Adam Stanford"
            "manager": {
              "email": "simonsais@psincs-test01.newjnj.com"
            }
          },
          "relatedPeople": [{
            "email": "EdgarMountainRamirez@psincs-test01.newjnj.com",
            "displayName": "Edgar Mountain Ramirez"
          }, {
            "email": "FranciscoJoseMartinez@psincs-test01.newjnj.com",
            "displayName": "Francisco Jose Martinez"
          }],
          "relationType": "DIRECT_REPORTS",
        }
      }
    }
  }]
}

Tắt tính năng tối ưu hoá, bao gồm cả kết quả bổ sung

Theo mặc định, các tính năng tối ưu hoá (chẳng hạn như kết quả bổ sung) sẽ được bật. Tuy nhiên, bạn có thể tắt tất cả các tính năng tối ưu hoá hoặc chỉ tắt kết quả bổ sung ở cả cấp ứng dụng tìm kiếm và cấp cụm từ tìm kiếm:

Làm nổi bật đoạn mã

Đối với các mục được trả về chứa văn bản được lập chỉ mục hoặc nội dung HTML, hệ thống sẽ trả về một đoạn nội dung. Nội dung này giúp người dùng xác định mức độ liên quan của mặt hàng được trả lại.

Nếu có cụm từ tìm kiếm trong đoạn mã, thì một hoặc nhiều phạm vi khớp xác định vị trí của các cụm từ đó cũng sẽ được trả về.

Sử dụng matchRanges để làm nổi bật văn bản trùng khớp khi kết xuất kết quả. Ví dụ về JavaScript sau đây chuyển đổi đoạn mã thành mã đánh dấu HTML, trong đó mỗi dải ô trùng khớp được gói trong thẻ <span>.

function highlightSnippet(snippet) {
  let text = snippet.snippet;
  let formattedText = text;
  if (snippet.matchRanges) {
    let parts = [];
    let index = 0;
    for (let match of snippet.matchRanges) {
      let start = match.start || 0; // Default to 0 if omitted
      let end = match.end;
      if (index < start) { // Include any leading text before/between ranges
        parts.push(text.slice(index, start));
      }
      parts.push('<span class="highlight">');
      parts.push(text.slice(start, end));
      parts.push('</span>');
      index = end;
    }
    parts.push(text.slice(index)); // Include any trailing text after last range
    formattedText = parts.join('');
  }
  return formattedText;
}

Cho đoạn mã sau:

{
  "snippet": "This is an example snippet...",
  "matchRanges": [
    {
      "start": 11,
      "end": 18
    }
  ]
}

Chuỗi HTML thu được là:

This is an <span class="highlight">example</span> snippet...

Siêu dữ liệu đang hiển thị

Sử dụng trường metadata để hiển thị thêm thông tin về mục được trả về có thể liên quan đến người dùng. Trường metadata bao gồm createTimeupdateTime của mặt hàng cũng như mọi dữ liệu có cấu trúc có thể trả về được liên kết với mặt hàng đó.

Để hiển thị dữ liệu có cấu trúc, hãy sử dụng trường displayOptions. Trường displayOptions chứa nhãn hiển thị cho loại đối tượng và một tập hợp metalines. Mỗi dòng siêu dữ liệu là một mảng gồm các nhãn hiển thị và cặp giá trị được định cấu hình trong giản đồ.

Truy xuất kết quả bổ sung

Để truy xuất thêm kết quả, hãy đặt trường start trong yêu cầu thành độ dời mong muốn. Bạn có thể điều chỉnh kích thước của từng trang bằng trường pageSize.

Để hiển thị số lượng mục được trả về hoặc để hiển thị các chế độ điều khiển phân trang để xem qua các mục được trả về, hãy sử dụng trường resultCount. Tuỳ thuộc vào kích thước của tập hợp kết quả, hệ thống sẽ cung cấp giá trị thực tế hoặc giá trị ước tính.

Phân loại kết quả

Sử dụng trường sortOptions để chỉ định thứ tự của các mục được trả về. Giá trị sortOptions là một đối tượng có hai trường:

  • operatorName – toán tử cho thuộc tính dữ liệu có cấu trúc để sắp xếp theo. Đối với các thuộc tính có nhiều toán tử, bạn chỉ có thể sắp xếp bằng toán tử bằng chính.
  • sortOrder – hướng sắp xếp, ASCENDING hoặc DESCENDING.

Mức độ liên quan cũng được dùng làm khoá sắp xếp phụ. Nếu bạn không chỉ định thứ tự sắp xếp trong truy vấn, thì kết quả chỉ được xếp hạng theo mức độ liên quan.

"sortOptions": {
  "operatorName": "priority",
  "sortOrder": "DESCENDING"
}

Thêm bộ lọc

Ngoài biểu thức truy vấn, bạn có thể hạn chế thêm kết quả bằng cách áp dụng bộ lọc. Bạn có thể chỉ định bộ lọc trong cả ứng dụng tìm kiếm cũng như trong yêu cầu tìm kiếm.

Để thêm bộ lọc trong một yêu cầu hoặc ứng dụng tìm kiếm, hãy thêm bộ lọc vào trường dataSourceRestrictions.filterOptions[].

Có 2 cách chính để lọc thêm nguồn dữ liệu:

  • Bộ lọc đối tượng, thông qua thuộc tính filterOptions[].objectType – hạn chế các mục khớp với loại đã chỉ định như được xác định trong giản đồ tuỳ chỉnh.
  • Bộ lọc giá trị – hạn chế các mục khớp dựa trên toán tử truy vấn và giá trị được cung cấp.

Bộ lọc tổng hợp cho phép kết hợp nhiều bộ lọc giá trị thành biểu thức logic cho các truy vấn phức tạp hơn.

Trong ví dụ về giản đồ phim, bạn có thể áp dụng quy tắc ràng buộc về độ tuổi dựa trên người dùng hiện tại và hạn chế các bộ phim có sẵn dựa trên mức phân loại của MPAA.

{
  "query": "adventure",
  "requestOptions": {
    "searchApplicationId": "<search_app_id>"
  },
  "dataSourceRestrictions": [
    {
      "source": {
        "name": "datasources/<data_source_id>"
      },
      "filterOptions": [
        {
          "objectType": "movie",
          "filter": {
            "compositeFilter": {
              "logicOperator": "AND"
              "subFilters": [
                {
                  "compositeFilter": {
                  "logicOperator": "OR"
                  "subFilters": [
                    {
                      "valueFilter": {
                        "operatorName": "rated",
                        "value": {
                          "stringValue": "G"
                        }
                      }
                    },
                    {
                      "valueFilter": {
                        "operatorName": "rated",
                        "value": {
                          "stringValue": "PG"
                        }
                      }
                    }
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  ]
}

Tinh chỉnh kết quả bằng phương diện

Phương diện là các thuộc tính được lập chỉ mục đại diện cho các danh mục để tinh chỉnh kết quả tìm kiếm. Sử dụng các phương diện để giúp người dùng tinh chỉnh truy vấn một cách tương tác và tìm thấy các mục liên quan nhanh hơn.

Bạn có thể xác định các phương diện trong ứng dụng tìm kiếm và ghi đè bằng các chế độ cài đặt trong truy vấn.

Khi yêu cầu các phương diện, Cloud Search sẽ tính toán các giá trị thường gặp nhất cho các thuộc tính được yêu cầu trong số các mục trùng khớp. Các giá trị này được trả về trong phản hồi. Sử dụng các giá trị này để tạo bộ lọc giúp thu hẹp kết quả cho các truy vấn tiếp theo.

Mẫu tương tác thông thường với các khía cạnh là:

  1. Tạo một truy vấn ban đầu chỉ định những thuộc tính cần đưa vào kết quả phân tích theo phương diện.
  2. Kết xuất kết quả tìm kiếm và kết quả theo phương diện.
  3. Người dùng chọn một hoặc nhiều giá trị phương diện để tinh chỉnh kết quả.
  4. Lặp lại truy vấn bằng bộ lọc dựa trên các giá trị đã chọn.

Ví dụ: để cho phép tinh chỉnh cụm từ tìm kiếm về phim theo năm và mức phân loại của MPAA, hãy đưa thuộc tính facetOptions vào cụm từ tìm kiếm.

"facetOptions": [
  {
    "sourceName": "datasources/<data_source_id>",
    "operatorName": "year"
  },
  {
    "sourceName": "datasources/<data_source_id>",
    "operatorName": "rated"
  }
]

Kết quả của phương diện có các trường dựa trên số nguyên

Bạn cũng có thể phân tích kết quả yêu cầu theo các trường dựa trên số nguyên. Ví dụ: bạn có thể đánh dấu một thuộc tính số nguyên có tên là book_pages là mặt để tinh chỉnh kết quả tìm kiếm về sách có "100-200" trang.

Khi thiết lập giản đồ trường thuộc tính số nguyên, hãy đặt isFacetable thành true và thêm các tuỳ chọn nhóm tương ứng vào integerPropertyOptions. Điều này đảm bảo rằng mọi thuộc tính mặt bảng số nguyên đều có các tuỳ chọn nhóm mặc định được xác định.

Khi xác định logic tuỳ chọn nhóm, hãy cung cấp một mảng các giá trị gia tăng biểu thị các phạm vi. Ví dụ: nếu người dùng cuối chỉ định các dải ô là 2, 5, 10, 100, thì các phương diện cho <2, [2-5), [5-10), [10-100), >=100 sẽ được tính toán.

Bạn có thể ghi đè các phương diện dựa trên số nguyên bằng cách xác định các tuỳ chọn nhóm giống nhau thành facetOptions trong yêu cầu. Nếu cần, Cloud Search sẽ sử dụng các tuỳ chọn nhóm được xác định trong giản đồ khi cả ứng dụng tìm kiếm và yêu cầu truy vấn đều không xác định tuỳ chọn mặt. Các phương diện được xác định trong truy vấn sẽ được ưu tiên hơn các phương diện được xác định trong ứng dụng tìm kiếm và các phương diện được xác định trong ứng dụng tìm kiếm sẽ được ưu tiên hơn các phương diện được xác định trong giản đồ.

Kết quả theo phương diện kích thước hoặc ngày của tài liệu

Bạn có thể sử dụng toán tử dành riêng để tinh chỉnh kết quả tìm kiếm theo kích thước tệp của tài liệu, được tính bằng byte hoặc theo thời điểm tài liệu được tạo hoặc sửa đổi. Bạn không cần xác định giản đồ tuỳ chỉnh, nhưng bạn cần chỉ định giá trị operatorName trong FacetOptions của ứng dụng tìm kiếm.

  • Để phân tách theo kích thước tài liệu, hãy sử dụng itemsize và xác định các tuỳ chọn nhóm.
  • Để phân tách theo ngày tạo tài liệu, hãy sử dụng createddatetimestamp.
  • Để phân tách theo ngày sửa đổi tài liệu, hãy sử dụng lastmodified.

Diễn giải nhóm phương diện

Thuộc tính facetResults trong phản hồi cụm từ tìm kiếm bao gồm yêu cầu bộ lọc chính xác của người dùng trong trường filter cho mỗi bucket.

Đối với các phương diện không dựa trên số nguyên, facetResults sẽ bao gồm một mục nhập cho mỗi thuộc tính được yêu cầu. Đối với mỗi thuộc tính, hệ thống sẽ cung cấp một danh sách các giá trị hoặc dải ô, được gọi là buckets. Các giá trị thường xuyên xuất hiện nhất sẽ xuất hiện trước.

Khi người dùng chọn một hoặc nhiều giá trị để lọc, hãy tạo một truy vấn mới bằng các bộ lọc đã chọn và truy vấn lại API.

Thêm đề xuất

Sử dụng API suggest để tự động hoàn thành các cụm từ tìm kiếm dựa trên nhật ký cụm từ tìm kiếm cá nhân của người dùng cũng như danh bạ và tập hợp tài liệu của họ.

Ví dụ: lệnh gọi sau đây đưa ra các đề xuất cho một phần cụm từ jo.

{
  "query": "jo",
  "requestOptions": {
    "searchApplicationId": "<search_app_id>",
    "peoplePhotoOptions": {
      "peoplePhotoUrlSizeInPx": 32
    },
    "timeZone": "America/Denver"
  }
}

Sau đó, bạn có thể hiển thị các đề xuất thu được sao cho phù hợp với ứng dụng của mình.