

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 查询索引
<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 还可以根据您可能为搜索设置的任何 field/attribute 过滤器来筛选响应。例如，如果您有一个名为“部门”的自定义字段，则可以筛选响应以仅返回名为“法律”的部门的文档。有关更多信息，请参阅[自定义字段和属性](https://docs.aws.amazon.com/kendra/latest/dg/custom-attributes.html)。

返回的搜索结果按每个文档所确 Amazon Kendra 定的相关性进行排序。结果是分页的，这样您就可以一次向用户显示一个页面。

要搜索已编入索引的 Amazon Kendra 文档 Amazon Lex，请使用[亚马逊。 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)。

以下示例说明如何搜索索引。 Amazon Kendra 确定最适合查询的搜索结果类型（答案、文档、问题答案）。您无法配置 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 资源名称。
+ 设置 AWS Command Line Interface、SDK 或转到 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 控制台，[网址为 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` 值更改为要搜索的索引的索引标识符。

  您还可以在调用 [Query](https://docs.aws.amazon.com/kendra/latest/APIReference/API_Query.html) API 时获取作为响应元素一部分的搜索查询 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://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*
   + 键：*Content-Encoding*

     值：*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) NOT rainforest`读取 `NOT rainforest` 之前的 `(amazon AND sports)`。
+ 范围：日期或数字范围值。范围可以是包容性的、排他的，也可以是无界的。例如，您可以搜索上次更新于 2020 年 1 月 1 日至 2020 年 12 月 31 日之间的文档，包括这些日期。
+ 字段：使用特定字段限制搜索范围。例如，您可以搜索在“位置”字段中带有“美国”字样的文档。
+ 通配符：部分匹配一串文本。例如，`Cloud*`可以匹配 CloudFormation。 Amazon Kendra 目前仅支持尾随通配符。
+ 精确引号：精确匹配一串文本。例如，包含 `"Amazon Kendra" "pricing"` 的文档。

您可以使用上述任何运算符的组合。

请注意，过度使用运算符或查询高度复杂可能会影响查询延迟。就延迟而言，通配符是最昂贵的运算符之一。一般规则是，使用的术语和运算符越多，对延迟的潜在影响就越大。影响延迟的其他因素包括已编入索引的文档的平均大小、索引的大小、对搜索结果的任何筛选以及 Amazon Kendra 索引的总体负载。

### 布尔值
<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 雨林的文档。

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

您可以使用圆括号按优先顺序查询嵌套单词。圆括号表示应 Amazon Kendra 如何读取查询。

以下是使用圆括号运算符的示例。

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

返回文本中同时包含“amazon”和“sports”，但不包含“rainforest”一词的文档。这是为了搜索 Amazon Prime 视频体育或其他类似内容，而不是 Amazon 雨林中的冒险运动。括号有助于表明 `amazon AND sports` 应该在 `NOT rainforest` 之前读取。不应将该查询理解为 `amazon AND (sports NOT rainforest)`。

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

返回包含“sports”或“recreation”（或两者兼而有之）以及“amazon”一词的文档。但它不包括“rainforest”一词。这是为了搜索 Amazon Prime 视频体育或娱乐，而不是 Amazon 雨林中的冒险运动。括号有助于指明 `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 日。

对于既不包含也不排除的无界定范围，只需使用 < and > 运算符即可。例如，`_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 目前仅支持尾随通配符。尾随通配符的前缀字符数必须大于二。

以下是使用通配符运算符的示例。

 **`Cloud*`** 

返回包含 CloudFormation 和等变体的文档 CloudWatch。

 **`kendra*aws`** 

返回包含 kendra.amazonaws 等变体的文档。

 **`kendra*aws*`** 

返回包含 kendra.amazonaws.com 等变体的文档

#### 确切限额
<a name="query-syntax-exact-quote"></a>

您可以使用引号来搜索一段文本的精确匹配项。

以下是使用引号的示例。

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

返回同时包含短语“Amazon Kendra”和“定价”一词的文档。文档必须同时包含“Amazon Kendra”和“定价”才能返回结果。

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

返回同时包含短语“Amazon Kendra”和“定价”一词以及可选的“成本”一词的文档。文档必须同时包含“Amazon Kendra”和“定价”才能返回结果，但不一定包含“成本”。

#### 查询语法无效
<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`** 

日期无效。公历没有 32 日，只有 Amazon Kendra才会使用 32 日。

 **`_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 管理控制台 并打开 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");
          }
      }
  }
  ```

------