

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 查詢索引
<a name="searching-example"></a>

**注意**  
功能支援會因索引類型和正在使用的搜尋 API 而有所不同。若要查看您正在使用的索引類型和搜尋 API 是否支援此功能，請參閱[索引類型](https://docs.aws.amazon.com/kendra/latest/dg/hiw-index-types.html)。

當您搜尋索引時， Amazon Kendra 會使用您提供的所有文件相關資訊，來判斷與輸入的搜尋詞彙最相關的文件。 Amazon Kendra 考慮的一些項目包括：
+ 文件的文字或內文。
+ 文件的標題。
+ 您標示為可搜尋的自訂文字欄位。
+ 您指定的日期欄位應該用來判斷文件的「重新整理」。
+ 可提供相關資訊的任何其他欄位。

Amazon Kendra 也可以根據您為搜尋設定的任何欄位/屬性篩選條件來篩選回應。例如，如果您有一個名為 "department" 的自訂欄位，您可以篩選回應，只傳回名為 "legal" 的部門的文件。如需詳細資訊，請參閱[自訂欄位或屬性](https://docs.aws.amazon.com/kendra/latest/dg/custom-attributes.html)。

傳回的搜尋結果會依為每個文件 Amazon Kendra 決定的相關性進行排序。系統會分頁結果，以便您一次向使用者顯示頁面。

若要搜尋您已 Amazon Kendra 編製索引的文件 Amazon Lex，請使用 [AMAZON.KendraSearchIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_KendraConfiguration.html)。如需使用 設定 Amazon Kendra 的範例 Amazon Lex，請參閱[為 Amazon Kendra 索引建立常見問答集機器人](https://docs.aws.amazon.com/lexv2/latest/dg/faq-bot-kendra-search.html)。

下列範例示範如何搜尋 index. Amazon Kendra determine 最適合查詢的搜尋結果類型 （答案、文件、問題答案）。您無法 Amazon Kendra 將 設定為將特定類型的搜尋回應 （答案、文件、問答） 傳回至查詢。

如需查詢回應的資訊，請參閱 [查詢回應和回應類型](query-responses-types.md)。

**Topics**
+ [先決條件](#searching-prerequisites)
+ [搜尋索引 （主控台）](#searching-index-console)
+ [搜尋索引 (SDK)](#searching-index-sdk)
+ [搜尋索引 (Postman)](#searching-index-postman)
+ [使用進階查詢語法搜尋](#searching-index-query-syntax)
+ [以語言搜尋](#searching-index-languages)

## 先決條件
<a name="searching-prerequisites"></a>

使用[查詢](https://docs.aws.amazon.com/kendra/latest/APIReference/API_Query.html) API 查詢索引之前：
+ 設定索引的必要許可，並連接至資料來源或批次上傳您的文件。如需詳細資訊，請參閱 [IAM 角色](https://docs.aws.amazon.com/kendra/latest/dg/iam-roles.html)。當您呼叫 API 來建立索引和資料來源連接器或批次上傳文件時，您可以使用角色的 Amazon Resource Name。
+ 設定 AWS Command Line Interface、 開發套件，或前往 Amazon Kendra 主控台。如需詳細資訊，請參閱[設定 Amazon Kendra](https://docs.aws.amazon.com/kendra/latest/dg/setup.html)。
+ 建立索引並連線到文件或批次上傳文件的資料來源。如需詳細資訊，請參閱[建立索引](https://docs.aws.amazon.com/kendra/latest/dg/create-index.html)和[建立資料來源連接器](https://docs.aws.amazon.com/kendra/latest/dg/data-source.html)。

## 搜尋索引 （主控台）
<a name="searching-index-console"></a>

您可以使用 Amazon Kendra 主控台來搜尋和測試索引。您可以進行查詢並查看結果。

**使用主控台搜尋索引**

1. 登入 AWS 管理主控台 並在 Amazon Kendra https：//[http://console.aws.amazon.com/kendra/](https://console.aws.amazon.com/kendra) 開啟 主控台。

1. 在導覽窗格中，選擇**索引**。

1. 選擇您的索引。

1. 在導覽功能表中，選擇搜尋索引的選項。

1. 在文字方塊中輸入查詢，然後按 Enter 鍵。

1. Amazon Kendra 會傳回搜尋結果。

您也可以選取側邊面板中的燈泡圖示，以取得搜尋的查詢 ID。

## 搜尋索引 (SDK)
<a name="searching-index-sdk"></a>

**使用 Python 或 Java 搜尋索引**
+ 下列範例會搜尋索引。將 的值`query`變更為您的搜尋查詢，並將 `index_id`或 `indexId` 變更為您要搜尋之索引的索引識別符。

  您也可以在呼叫查詢 API 時，取得搜尋的[查詢](https://docs.aws.amazon.com/kendra/latest/APIReference/API_Query.html) ID 做為回應元素的一部分。

------
#### [ Python ]

  ```
  import boto3
  import pprint
  
  kendra = boto3.client("kendra")
  
  # Provide the index ID
  index_id = "index-id"
  # Provide the query text
  query = "query text"
  
  response = kendra.query(
          QueryText = query,
          IndexId = index_id)
  
  print("\nSearch results for query: " + query + "\n")        
  
  for query_result in response["ResultItems"]:
  
      print("-------------------")
      print("Type: " + str(query_result["Type"]))
          
      if query_result["Type"]=="ANSWER" or query_result["Type"]=="QUESTION_ANSWER":
          answer_text = query_result["DocumentExcerpt"]["Text"]
          print(answer_text)
  
      if query_result["Type"]=="DOCUMENT":
          if "DocumentTitle" in query_result:
              document_title = query_result["DocumentTitle"]["Text"]
              print("Title: " + document_title)
          document_text = query_result["DocumentExcerpt"]["Text"]
          print(document_text)
  
      print("------------------\n\n")
  ```

------
#### [ Java ]

  ```
  package com.amazonaws.kendra;
  
  import software.amazon.awssdk.services.kendra.KendraClient;
  import software.amazon.awssdk.services.kendra.model.QueryRequest;
  import software.amazon.awssdk.services.kendra.model.QueryResponse;
  import software.amazon.awssdk.services.kendra.model.QueryResultItem;
  
  public class SearchIndexExample {
      public static void main(String[] args) {
          KendraClient kendra = KendraClient.builder().build();
  
          String query = "query text";
          String indexId = "index-id";
  
          QueryRequest queryRequest = QueryRequest
              .builder()
              .queryText(query)
              .indexId(indexId)
              .build();
  
          QueryResponse queryResponse = kendra.query(queryRequest);
  
          System.out.println(String.format("\nSearch results for query: %s", query));
          for(QueryResultItem item: queryResponse.resultItems()) {
              System.out.println("----------------------");
              System.out.println(String.format("Type: %s", item.type()));
  
              switch(item.type()) {
                  case QUESTION_ANSWER:
                  case ANSWER:
                      String answerText = item.documentExcerpt().text();
                      System.out.println(answerText);
                      break;
                  case DOCUMENT:
                      String documentTitle = item.documentTitle().text();
                      System.out.println(String.format("Title: %s", documentTitle));
                      String documentExcerpt = item.documentExcerpt().text();
                      System.out.println(String.format("Excerpt: %s", documentExcerpt));
                      break;
                  default:
                      System.out.println(String.format("Unknown query result type: %s", item.type()));
  
              }
  
              System.out.println("-----------------------\n");
          }
      }
  }
  ```

------

## 搜尋索引 (Postman)
<a name="searching-index-postman"></a>

您可以使用 [Postman](https://www.postman.com/) 查詢和測試 Amazon Kendra 索引。

**使用 Postman 搜尋索引**

1. 在 Postman 中建立新的集合，並將請求類型設定為 **POST**。

1. 輸入端點 URL。例如，https：//*https://kendra.<region>.amazonaws.com*。

1. 選取**授權**索引標籤，然後輸入下列資訊。
   + **類型** - 選取**AWS 簽章**。
   + **AccessKey** - 輸入您建立 IAM 使用者時產生的存取金鑰。
   + **SecretKey** - 輸入建立 IAM 使用者時產生的私密金鑰。
   + **AWS 區域** - 輸入您索引的區域。例如，*us-west-2*。
   + **服務名稱** - 輸入 *kendra*。這區分大小寫，因此必須是小寫。
**警告**  
如果您輸入不正確的服務名稱或不使用小寫，當您選取**傳送**以傳送請求時，會擲回錯誤：「憑證應範圍限定為正確的服務「kendra」。」  
您也必須檢查是否已輸入正確的存取金鑰和私密金鑰。

1. 選取**標頭**索引標籤，然後輸入下列索引鍵和值資訊。
   + 金鑰：*X-Amz-Target*

     值：*com.amazonaws.kendra.AWSKendraFrontendService.Query*
   + 金鑰：*內容編碼*

     值：*amz-1.0*

1. 選取**內文**索引標籤，然後執行下列動作。
   + 選擇請求內文的**原始** JSON 類型。
   + 輸入包含索引 ID 和查詢文字的 JSON。

     ```
     {
         "IndexId": "{{index-id}}",
         "QueryText": "enter a query here"
     }
     ```
**警告**  
如果您的 JSON 未使用正確的推論，則會擲回錯誤：「SerializationException」。檢查 JSON 中的推論。

1. 選取**傳送** （靠近右上角）。

## 使用進階查詢語法搜尋
<a name="searching-index-query-syntax"></a>

您可以使用進階查詢語法或運算子，建立比簡單關鍵字或自然語言查詢更具體的查詢。這包括範圍、布林值、萬用字元等。透過使用運算子，您可以為查詢提供更多內容，並進一步精簡搜尋結果。

Amazon Kendra 支援下列運算子。
+ 布林值：限制或擴展搜尋的邏輯。例如， 會將搜尋`amazon AND sports`限制為僅搜尋包含兩個詞彙的文件。
+ 括號：依優先順序讀取巢狀查詢詞彙。例如， 會在 `(amazon AND sports)`之前`(amazon AND sports) NOT rainforest`讀取`NOT rainforest`。
+ 範圍：日期或數值範圍值。範圍可以是包含、獨佔或無限制。例如，您可以搜尋上次在 2020 年 1 月 1 日至 2020 年 12 月 31 日期間更新的文件，包括這些日期。
+ 欄位：使用特定欄位來限制搜尋。例如，您可以在「位置」欄位中搜尋具有「美國」的文件。
+ 萬用字元：部分符合文字字串。例如， `Cloud*`可以比對 CloudFormation。 Amazon Kendra 目前僅支援結尾萬用字元。
+ 確切引號：完全符合文字字串。例如，包含 的文件`"Amazon Kendra" "pricing"`。

您可以使用上述任一運算子的組合。

請注意，過度使用運算子或高度複雜的查詢可能會影響查詢延遲。萬用字元是延遲方面一些最昂貴的運算子。一般規則是您使用的詞彙和運算子越多，對延遲的潛在影響就越大。影響延遲的其他因素包括編製索引的文件平均大小、索引大小、搜尋結果的任何篩選，以及 Amazon Kendra 索引的整體負載。

### Boolean
<a name="query-syntax-boolean"></a>

您可以使用布林運算子 `AND`、`OR`、 來合併或排除單字`NOT`。

以下是使用布林值運算子的範例。

 **`amazon AND sports`** 

傳回搜尋結果，其中包含文字中的「amazon」和「sports」，例如 Amazon Prime 影片運動或其他類似內容。

 **`sports OR recreation`** 

在文字中傳回包含 'sports' 或 'recreation' 或兩者的搜尋結果。

 **`amazon NOT rainforest`** 

傳回搜尋結果，其中包含文字中的「amazon」一詞，但不包含「rainforest」一詞。這是為了搜尋有關公司 Amazon 而非 Amazon Rainforest 的文件。

### 括號
<a name="query-syntax-parentheses"></a>

您可以使用括號，依優先順序查詢巢狀單字。括號指出應 Amazon Kendra 如何讀取查詢。

以下是使用括號運算子的範例。

 **`(amazon AND sports) NOT rainforest`** 

傳回包含文字中 'amazon' 和 'sports' 兩個詞彙的文件，但不包含 'rainforest' 一詞。這是為了搜尋 Amazon Prime 影片運動或其他類似的內容，而不是 Amazon Rainforest 中的冒險運動。括號有助於指出 `amazon AND sports` 應該在 之前讀取`NOT rainforest`。查詢不應讀取為 `amazon AND (sports NOT rainforest)`。

 **`(amazon AND (sports OR recreation)) NOT rainforest`** 

傳回包含 'sports' 或 'recreation' 或兩者，以及 'amazon' 一詞的文件。但不包含「rainforest」一詞。這是搜尋 Amazon Prime 影片運動或娛樂，而不是 Amazon Rainforest 中的冒險運動。括號有助於指出 `sports OR recreation` 應該在與 之前讀取的 'amazon' 結合之前讀取`NOT rainforest`。查詢不應讀取為 `amazon AND (sports OR (recreation NOT rainforest))`。

### 範圍
<a name="query-syntax-ranges"></a>

您可以使用一系列的值來篩選搜尋結果。您可以指定屬性和範圍值。這可以是日期或數字類型。

日期範圍必須採用下列格式：
+ Epoch
+ YYYY
+ YYYY-mm
+ YYYY-mm-dd
+ YYYY-mm-dd'T'HH

您也可以指定是否包含或排除範圍的較低和較高值。

以下是使用範圍運算子的範例。

 **`_processed_date:>2019-12-31 AND _processed_date:<2021-01-01`** 

傳回 2020 年處理的文件，大於 2019 年 12 月 31 日且小於 2021 年 1 月 1 日。

 **`_processed_date:>=2020-01-01 AND _processed_date:<=2020-12-31`** 

傳回在 2020 年處理的文件，大於或等於 2020 年 1 月 1 日，以及小於或等於 2020 年 12 月 31 日。

 **`_document_likes:<1`** 

傳回零喜歡或沒有使用者意見回饋的文件，少於 1 個類似。

您可以指定是否應將範圍視為包含或排除指定範圍值。

 **包含** 

 **`_last_updated_at:[2020-01-01 TO 2020-12-31]`** 

傳回上次在 2020 年更新的文件，包括 2020 年 12 月 1 日至 2020 年 12 月 31 日的日期。

 **獨家** 

 **`_last_updated_at:{2019-12-31 TO 2021-01-01}`** 

傳回上次在 2020 年更新的文件 - 不包括 2019 年 12 月 31 日和 2021 年 1 月 1 日的日期。

對於不包含或獨佔的未限制範圍，只需使用 < 和 > 運算子。例如 `_last_updated_at:>2019-12-31 AND _last_updated_at:<2021-01-01` 

#### 欄位
<a name="query-syntax-fields"></a>

您可以將搜尋限制為僅傳回符合特定欄位中值的文件。欄位可以是任何類型的欄位。

以下是使用欄位層級內容運算子的範例。

 **`status:"Incomplete" AND financial_year:2021`** 

傳回 2021 會計年度的文件，其狀態為不完整。

 **`(sports OR recreation) AND country:"United States" AND level:"professional"`** 

傳回討論美國職業運動或重建的文件。

#### 萬用字元
<a name="query-syntax-wildcards"></a>

您可以使用萬用字元運算子擴大搜尋範圍，以考量字詞和片語的變體。這在搜尋名稱變體時非常有用。 Amazon Kendra 目前僅支援結尾萬用字元。結尾萬用字元的字首字元數必須大於 2。

以下是使用萬用字元運算子的範例。

 **`Cloud*`** 

傳回包含 CloudFormation 和 CloudWatch 等變體的文件。

 **`kendra*aws`** 

傳回包含 kendra.amazonaws 等變體的文件。

 **`kendra*aws*`** 

傳回包含變體的文件，例如 kendra.amazonaws.com

#### 精確引號
<a name="query-syntax-exact-quote"></a>

您可以使用引號來搜尋一段文字的完全相符項目。

以下是使用引號的範例。

 **`"Amazon Kendra" "pricing"`** 

傳回同時包含片語 'Amazon Kendra' 和術語 'pricing' 的文件。文件必須同時包含 'Amazon Kendra' 和 'pricing'，才能傳回結果。

 **`"Amazon Kendra" "pricing" cost`** 

傳回同時包含片語 'Amazon Kendra' 和術語 'pricing'，以及選用術語 'cost' 的文件。文件必須同時包含 'Amazon Kendra' 和 'pricing'，才能傳回結果，但不一定包含 'cost'。

#### 無效的查詢語法
<a name="query-syntax-invalid"></a>

Amazon Kendra 如果您的查詢語法發生問題或目前不支援您的查詢， 會發出警告 Amazon Kendra。如需詳細資訊，請參閱 [API 文件以取得查詢警告](https://docs.aws.amazon.com/kendra/latest/APIReference/API_Warning.html)。

下列查詢是無效的查詢語法範例。

 **`_last_updated_at:<2021-12-32`** 

無效的日期。Gregorian 行事曆中不存在第 32 天，由 使用 Amazon Kendra。

 **`_view_count:ten`** 

無效的數值。必須使用數字來表示數值。

 **`nonExistentField:123`** 

欄位搜尋無效。欄位必須存在才能使用欄位搜尋。

 **`Product:[A TO D]`** 

無效的範圍。範圍必須使用數值或日期。

 **`OR Hello`** 

布林值無效。運算子必須與術語搭配使用，並放置在術語之間。

## 以語言搜尋
<a name="searching-index-languages"></a>

您可以搜尋支援語言的文件。您可以在 [AttributeFilter](https://docs.aws.amazon.com/kendra/latest/APIReference/API_AttributeFilter.html) 中傳遞語言代碼，以您選擇的語言傳回篩選的文件。您可以使用支援的語言輸入查詢。

如果您未指定語言， 預設會以英文 Amazon Kendra 查詢文件。如需支援語言的詳細資訊，包括其代碼，請參閱[新增英文以外語言的文件](https://docs.aws.amazon.com/kendra/latest/dg/in-adding-languages.html)。

若要在 主控台中搜尋支援語言的文件，請選取您的索引，然後從導覽功能表中選取搜尋索引的選項。選擇搜尋設定，然後從下拉式清單語言中選取語言，以選擇要傳回文件**的語言**。

下列範例示範如何搜尋西班牙文文件。

**在 主控台中以西班牙文搜尋索引**

1. 登入 AWS 管理主控台 ，並在 https Amazon Kendra ：//[http://console.aws.amazon.com/kendra/](https://console.aws.amazon.com/kendra) 開啟 主控台。

1. 在導覽功能表中，選擇**索引**，然後選擇您的索引。

1. 在導覽功能表中，選擇搜尋索引的選項。

1. 在搜尋設定中，選取**語言**下拉式清單，然後選擇西班牙文。

1. 在文字方塊中輸入查詢，然後按 Enter 鍵。

1. Amazon Kendra 會以西班牙文傳回搜尋結果。

**使用 CLI、Python 或 Java 搜尋西班牙文索引**
+ 下列範例會搜尋西班牙文的索引。將值變更為`searchString`您的搜尋查詢，並將值`indexID`變更為您要搜尋之索引的識別符。西班牙文的語言代碼為 `es`。您可以將此取代為您自己的語言代碼。

------
#### [ CLI ]

  ```
  {
    "EqualsTo":{      
      "Key": "_language_code",
      "Value": {
      "StringValue": "es"
      }
    }
  }
  ```

------
#### [ Python ]

  ```
  import boto3
  import pprint
  
  kendra = boto3.client("kendra")
  
  # Provide the index ID
  index_id = "index-id"
  # Provide the query text
  query = "search-string"
  
  # Includes the index ID, query text, and language attribute filter
  response = kendra.query(
          QueryText = query,
          IndexId = index_id,
          AttributeFilter = {
              "EqualsTo": {      
                  "Key": "_language_code",
                  "Value": {
                      "StringValue": "es"
                      }
                  }
              })
  
  print ("\nSearch results|Resultados de la búsqueda: " + query + "\n")        
  
  for query_result in response["ResultItems"]:
  
      print("-------------------")
      print("Type: " + str(query_result["Type"]))
          
      if query_result["Type"]=="ANSWER" or query_result["Type"]=="QUESTION_ANSWER":
          answer_text = query_result["DocumentExcerpt"]["Text"]
          print(answer_text)
  
      if query_result["Type"]=="DOCUMENT":
          if "DocumentTitle" in query_result:
              document_title = query_result["DocumentTitle"]["Text"]
              print("Title: " + document_title)
          document_text = query_result["DocumentExcerpt"]["Text"]
          print(document_text)
  
      print("------------------\n\n")
  ```

------
#### [ Java ]

  ```
  package com.amazonaws.kendra;
  
  import software.amazon.awssdk.services.kendra.KendraClient;
  import software.amazon.awssdk.services.kendra.model.QueryRequest;
  import software.amazon.awssdk.services.kendra.model.QueryResponse;
  import software.amazon.awssdk.services.kendra.model.QueryResultItem;
  
  public class SearchIndexExample {
      public static void main(String[] args) {
          KendraClient kendra = KendraClient.builder().build();
  
          String query = "searchString";
          String indexId = "indexID";
  
          QueryRequest queryRequest = QueryRequest.builder()
              .queryText(query)
              .indexId(indexId)
              .attributeFilter(
                   AttributeFilter.builder()
                       .withEqualsTo(
                           DocumentAttribute.builder()
                               .withKey("_language_code")
                               .withValue("es")
                               .build())
                       .build())
              .build();
  
          QueryResponse queryResponse = kendra.query(queryRequest);
  
          System.out.println(String.format("\nSearch results|
                                            Resultados de la búsqueda: %s", query));
          for(QueryResultItem item: queryResponse.resultItems()) {
              System.out.println("----------------------");
              System.out.println(String.format("Type: %s", item.type()));
  
              switch(item.type()) {
                  case QUESTION_ANSWER:
                  case ANSWER:
                      String answerText = item.documentExcerpt().text();
                      System.out.println(answerText);
                      break;
                  case DOCUMENT:
                      String documentTitle = item.documentTitle().text();
                      System.out.println(String.format("Title: %s", documentTitle));
                      String documentExcerpt = item.documentExcerpt().text();
                      System.out.println(String.format("Excerpt: %s", documentExcerpt));
                      break;
                  default:
                      System.out.println(String.format("Unknown query result type: %s", item.type()));
  
              }
  
              System.out.println("-----------------------\n");
          }
      }
  }
  ```

------