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 để xây dựng giao diện tìm kiếm hoặc nhúng kết quả tìm kiếm vào 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

Việc xây dựng một giao diện tìm kiếm tối thiểu đòi hỏi nhiều bước:

  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ể cải thiện thêm giao diện tìm kiếm bằng các tính năng như phân trang, sắp xếp, lọc, các thuộc tính 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à các thuộc tính để yêu cầu. Nếu cần, bạn có thể ghi đè các tham số này bằng cách sử dụ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 Định cấu hình 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 đăng nhập để yêu cầu uỷ quyền thay mặt cho người dùng. Hãy 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 [Nền tảng nhận dạng của Google](https://developers.google.com/identity/choose-auth{: .external target="_blank"}.

Truy vấn chỉ mục

Sử dụng phương thức search để thực hiện tìm kiếm đối với chỉ mục.

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

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

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

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

Ở mức tối thiểu, giao diện tìm kiếm phải cho thấy mục title cũng như một đường liên kết đến mục gốc. Bạn có thể cải thiện thêm 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ề các 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 kết quả bổ sung được trả về. 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 các kết quả bổ sung, thì InterpretationType sẽ đượ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 rằng 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 "Nội dung tìm kiếm của bạn cho cụm từ tìm kiếm ban đầu không khớp với bất kỳ kết quả nào. 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 "Nội dung tìm kiếm của bạn cho truy vấn ban đầu không khớp với đủ kết quả. Bao gồm 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ề 2 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 về nhân viên của một người có tên được sử dụng trong truy vấn. Loại kết quả thứ hai là một hàm của tính năng Tìm kiếm người của Cloud Search và bạn có thể tìm thấy kết quả cho một truy vấn như vậy trong trường structuredResults của phản hồi của API truy vấn:

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

Đối sánh báo cáo trực tiếp

So khớp báo cáo trực tiếp là một tính năng Tìm kiếm người của Cloud Search, cho phép người dùng xem báo cáo trực tiếp của một người thuộc 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 của một người nào đó, phản hồi sẽ có assistCardProtoHolder trong structuredResults. assistCardProtoHolder có một trường tên là cardType. Trường này sẽ bằng RELATED_PEOPLE_ANSWER_CARD. assistCardProtoHolder chứa một thẻ có tên là relatedPeopleAnswerCard, thẻ này chứa phản hồi thực tế. Đối tượng này chứa subject (người được đưa vào truy vấn) và relatedPeople là tập hợp người có liên quan đến chủ đề. Trường relationType trả về giá trị MANAGER hoặc DIRECT_REPORTS.

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

{
  "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, được bật. Tuy nhiên, bạn có thể tắt tất cả tính năng tối ưu hoá hoặc chỉ các 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:

Đoạn trích nổi bật

Đối với các mục được trả về chứa nội dung văn bản hoặc HTML đã được lập chỉ mục, hàm sẽ trả về một đoạn trích của 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ục được trả về.

Nếu cụm từ truy vấn xuất hiện trong đoạn mã, thì một hoặc nhiều dải ô khớp xác định vị trí của 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 hiển thị kết quả. Ví dụ về JavaScript sau đây chuyển đổi đoạn mã thành mã đánh dấu HTML với mỗi dải ô phù hợp được gói trong một 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;
}

Đã cung cấp đoạn mã:

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

Chuỗi HTML kết quả là:

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

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

Sử dụng trường metadata để hiện 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ục cũng như mọi dữ liệu có cấu trúc có thể trả về liên kết với mục đó.

Để hiển thị dữ liệu có cấu trúc, hãy 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 metaline là một mảng các nhãn hiển thị và cặp giá trị như được định cấu hình trong giản đồ.

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

Để truy xuất kết quả bổ sung, hãy đặt trường start trong yêu cầu thành độ lệch 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 số lượng mục được trả về hoặc hiện các chế độ điều khiển phân trang cho các trang thông 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ả, giá trị thực tế hoặc giá trị ước tính sẽ được cung cấp.

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 – một toán tử để sắp xếp thuộc tính dữ liệu có cấu trúc. Đố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ử đẳng thức 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 không có thứ tự sắp xếp nào được chỉ định trong một truy vấn, các 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 các biểu thức truy vấn, bạn có thể giới hạn thêm kết quả bằng cách áp dụng bộ lọc. Bạn có thể chỉ định các bộ lọc cả trong ứng dụng tìm kiếm cũng như trong yêu cầu tìm kiếm.

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

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

  • Các bộ lọc đối tượng, thông qua thuộc tính filterOptions[].objectType, sẽ hạn chế các mục trùng 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 trùng 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ị vào biểu thức logic đối với 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 giới hạn độ tuổi dựa trên người dùng hiện tại và hạn chế các 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 các thuộc tính

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

Các thuộc tính có thể được xác định trong ứng dụng tìm kiếm và bị các chế độ cài đặt trong truy vấn ghi đè.

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

Mô hình tương tác điển hình với các thuộc tính là:

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

Ví dụ: để cho phép tinh lọc các truy vấn 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 truy vấn.

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

Kết quả thuộc tính với các trường dựa trên số nguyên

Bạn cũng có thể yêu cầu thuộc tính kết quả với 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 dưới dạng bảng hiển thị để tinh chỉnh kết quả cho một lượt tìm kiếm về những cuốn sách có trang "100-200".

Khi bạn 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 phân giỏ tương ứng vào integerPropertyOptions. Điều này đảm bảo rằng mọi thuộc tính có thể biến đổi số nguyên đều có tuỳ chọn phân giỏ mặc định được xác định.

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

Bạn có thể ghi đè các thuộc tính dựa trên số nguyên bằng cách xác định các tuỳ chọn phân bộ chứa tương tự cho facetOptions trong yêu cầu. Nếu cần, Cloud Search sẽ sử dụng các tuỳ chọn phân giỏ đượ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 được các tuỳ chọn thuộc tính. Các thuộc tính được xác định trong truy vấn được ưu tiên hơn các thuộc tính được xác định trong ứng dụng tìm kiếm. Đồng thời, các thuộc tính được xác định trong ứng dụng tìm kiếm sẽ được ưu tiên hơn các thuộc tính được xác định trong giản đồ.

Kết quả thuộc tính theo kích thước tài liệu hoặc ngày

Bạn có thể 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 đo bằng byte hoặc theo thời điểm tạo hoặc sửa đổi một tài liệu. Bạn không cần xác định giản đồ tuỳ chỉnh, nhưng cần chỉ định giá trị operatorName trong FacetOptions của ứng dụng tìm kiếm.

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

Diễn giải nhóm thuộc tính

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 từng bucket.

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

Khi người dùng chọn một hoặc nhiều giá trị cần 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 đề xuất để cung cấp tính năng tự động hoàn thành các cụm từ tìm kiếm dựa trên nhật ký truy vấn cá nhân của người dùng cũng như danh bạ và tập sao lục tài liệu của họ.

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

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

Sau đó, bạn có thể cho thấy các đề xuất kết quả phù hợp với ứng dụng của mình.