

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

# 将自定义同义词添加到索引中
<a name="index-synonyms"></a>

要将自定义同义词添加到索引中，请在同义词库文件中指定这些同义词。在 Amazon Kendra 使用同义词时，可以包含特定于业务的术语或专业术语。通用英语同义词（例如）内置在同义词库文件中 `leader, head` Amazon Kendra ，不应包含在同义词库文件中，包括使用连字符的通用同义词。 Amazon Kendra 支持所有响应类型的同义词，包括`DOCUMENT`响应类型和 `QUESTION_ANSWER` /或`ANSWER`响应类型。 Amazon Kendra 目前不支持添加标记为停用词的同义词。这些同义词将包含在未来版本中。

Amazon Kendra 在同义词之间建立关联。例如，使用同义词对`Dynamo, Amazon DynamoDB`，将 Dynamo Amazon Kendra 与相关联。 Amazon DynamoDB查询“什么是 Dynamo？” 然后返回诸如 “什么是 Amazon DynamoDB？” 之类的文档。使用同义词， Amazon Kendra 可以更轻松地获取相关性。

同义词库文件是存储在存储桶中的文本文件。 Amazon S3 请参阅[将同义词库添加到索引中](index-synonyms-adding-thesaurus-file.md)。

同义词库文件使用 [Solr](https://lucene.apache.org/solr/guide/6_6/filter-descriptions.html#FilterDescriptions-SynonymGraphFilter) 同义词格式。 Amazon Kendra 对每个索引的同义词库数量有限制。请参阅[限额](https://docs.aws.amazon.com/kendra/latest/dg/quotas.html)。

同义词可能在以下场景中很有用：
+ 不是传统英语同义词的专业术语，例如，`NLP, Natural Language Processing`。
+ 具有复杂语义关联性的专有名词。例如，在机器学习中，`cost, loss, model performance` 是公众可能不太理解的名词。
+ 不同形式的产品名称，例如，`Elastic Compute Cloud, EC2`。
+ 特定领域或特定业务的术语，例如，产品名称。例如 `Route53, DNS`。

在以下情况下，请勿使用同义词：
+ 通用英语同义词，例如，`leader, head`。这些同义词不是特定于领域的，在这些场景中使用同义词可能会产生意想不到的影响。
+ 打字错误，例如，`teh => the`。
+ 词态变化，例如名词的复数和所有格形式，形容词的比较级和最高级形式，以及动词的过去时、过去分词和进行时。`good, better, best` 是比较级和最高级形容词的一个例子。
+ 一元（单个词）停用词，例如，`WHO`。一元停用词不能出现在同义词库中，因此将其排除在搜索范围之外。例如，`WHO => World Health Organization` 会被拒绝。但是，您可以使用 `W.H.O.` 作为同义词，也可以将停用词用作多词同义词的一部分。例如，不允许使用 `of`，但可以使用 `United States of America`。

自定义同义词可以扩展查询范围以涵盖特定于业务的同义词，从而轻松提高 Amazon Kendra对特定业务术语的理解。尽管同义词可以提高搜索准确性，但重要的是要了解同义词如何影响延迟，这样才能对其进行优化。

同义词的一般规则是：查询中与同义词匹配和扩展的词汇越多，对延迟的潜在影响就越大。影响延迟的其他因素包括已编入索引的文档的平均大小、索引的大小、对搜索结果的任何筛选以及 Amazon Kendra 索引的总体负载。与任何同义词都不匹配的查询不受影响。

关于同义词如何影响延迟的一般指南：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/kendra/latest/dg/index-synonyms.html)

\$1*性能因在索引上对同义词和配置的具体使用而异。最好测试搜索性能，以便针对您的特定用例获得更准确的基准。*

如果您的同义词库很大，词汇扩展率很高，并且延迟增加不在可接受的范围内，则可以尝试以下一两种方法：
+ 修剪同义词库以降低扩展率（每个词汇的同义词数量）。
+ 减少词汇的总体覆盖范围（同义词库中的行数）。

或者，您可以增加配置容量（虚拟存储单位）以抵消延迟的增加。

**Topics**
+ [创建同义词库文件](index-synonyms-creating-thesaurus-file.md)
+ [将同义词库添加到索引中](index-synonyms-adding-thesaurus-file.md)
+ [更新同义词库](index-synonyms-update.md)
+ [更新同义词库](index-synonyms-delete.md)
+ [在搜索结果中突出显示](index-synonyms-enabling-synonyms-in-results.md)

# 创建同义词库文件
<a name="index-synonyms-creating-thesaurus-file"></a>

 Amazon Kendra 同义词库文件是一个 UTF-8 编码的文件，其中包含 Solr 同义词列表格式的同义词列表。同义词库文件必须小于 5 MB。

指定同义词映射的方法有两种：
+ *双向同义词*是逗号分隔的词汇列表。如果您的用户查询任何词汇，则列表中的所有词汇都将用于搜索文档，其中包括原始查询词。
+ *单向同义词*是用符号 “=>” 分隔的词汇，意思是将词汇映射到其同义词。如果用户查询符号 “=>” 左边的词汇，则该词汇会映射到右边的词汇以使用同义词搜索文档。反之亦然，它不被映射，因而是单向的。

同义词本身区分大小写，但它们映射到的词汇不区分大小写。例如，`ML => Machine Learning` 表示如果您的用户查询“ML”或“ml”或使用其他大小写，它将映射到 “Machine Learning”。反之，如果您要这样映射 `Machine Learning => ML`，那么“Machine Learning”、“machine learning”或其他情况将映射到“ML”。

同义词不会搜索特殊字符的完全匹配项。例如，如果搜索 dead-letter-queue “”，则 Amazon Kendra 可以返回与 “死信队列”（无连字符）匹配的文档。如果您的文档包含连字符（例如 dead-letter-queue “”），则会在搜索过程中 Amazon Kendra 处理文档以删除连字符。对于内置于同义词库文件中 Amazon Kendra 且不应包含在同义词库文件中的通用英语同义词术语， Amazon Kendra 可以同时搜索该术语的连字符版本和该术语的非连字符版本。例如，如果您搜索 “第三方” 和 “第三方”，则 Amazon Kendra 返回与这两个术语的任一版本相匹配的文档。

对于包含停用词或常用词的同义词， Amazon Kendra 返回与包括停用词在内的术语匹配的文档。例如，您可以创建同义词规则来映射“on boarding”和“onboarding”。不得单独使用停用词作为同义词。例如，如果搜索 “on”，则 Amazon Kendra 无法返回所有包含 “on” 的文档。

搜索也会忽略某些同义词规则。例如，`a => b` 是一条规则，但搜索会将 `a => a` 忽略，不会将其算作规则。

词汇计数是同义词库文件中唯一词汇的数量。下面的示例文件包括术语 `AWS CodeStar`、`ML`、`Machine Learning`、`autoscaling group`、`ASG` 等。

每个同义词库有同义词规则数量上限，每个术语有同义词数量上限。有关更多信息，请参阅 [的配额 Amazon Kendra](quotas.md)。

以下示例显示了一个同义词库文件，其中包含同义词规则。每行都包含一条同义词规则。搜索会忽略空行和注释。

```
# Lines starting with pound are comments and blank lines are ignored.

# Synonym relationships can be defined as unidirectional or bidirectional relationships.

# Unidirection relationships are represented by any term sequence 
# on the left hand side (LHS) of "=>" followed by synonyms on the right hand side (RHS)
CodeStar => AWS CodeStar
# This will map CodeStar to AWS CodeStar, but not vice-versa

# To map terms vice versa
ML => Machine Learning
Machine Learning => ML

# Multiple synonym relationships may be defined in one line as well by comma seperation.
autoscaling group, ASG => Auto Scaling group, autoscaling
# The above is equivalent to:
# autoscaling group => Auto Scaling group, autoscaling
# ASG => Auto Scaling group, autoscaling

# Bi-directional synonyms are comma separated terms with no "=>"
DNS, Route53, Route 53
# DNS, Route53, and Route 53 map to one another and are interchangeable at match time
# The above is equivalent to:
# DNS => Route53, Route 53
# Route53 => DNS, Route 53
# Route 53 => DNS, Route53

# Overlapping LHS terms will be merged
Beta => Alpha
Beta => Gamma
Beta, Delta
# is equivalent to:
# Beta => Alpha, Gamma, Delta
# Delta => Beta

# Each line contains a single synonym rule.
# Synonym rule count is the total number of lines defining synonym relationships
# Term count is the total number of unique terms for all rules.  
# Comments and blanks lines do not count.
```

# 将同义词库添加到索引中
<a name="index-synonyms-adding-thesaurus-file"></a>

以下过程说明如何将包含同义词的同义词库文件添加到索引中。要了解更新后的同义词库文件的效果，最多可能需要 30 分钟。有关同义词库文件的更多信息，请参阅[创建同义词库文件](index-synonyms-creating-thesaurus-file.md)。

------
#### [ Console ]

**添加同义词库**

1. 在左侧导航窗格中要添加同义词列表的索引下，请选择**同义词**。

1. 在**同义词**页面上，选择**添加同义词库**。

1. 在**定义同义词库**中，为同义词库指定名称和可选描述。

1. 在**同义词库设置**中，提供同义词库文件的 Amazon S3 路径。文件必须小于 5 MB。

1. 对于 **IAM 角色**，选择**一个角色或选择创建新角色**并指定角色名称以创建新角色。 Amazon Kendra 使用此角色代表您访问 Amazon S3 资源。IAM 角色的前缀为 “AmazonKendra-”。

1. 选择**保存**以保存配置并添加同义词库。收录同义词库后，它就会处于活动状态，结果中会突出显示同义词。要了解同义词库文件的效果，最多可能需要 30 分钟。

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

要使用将同义词添加到索引中 AWS CLI，请调用：`create-thesaurus`

```
aws kendra create-thesaurus \
--index-id index-id \
--name "thesaurus-name" \
--description "thesaurus-description" \
--source-s3-path "Bucket=bucket-name,Key=thesaurus/synonyms.txt" \
--role-arn role-arn
```

调用 `list-thesauri` 以查看同义词库列表：

```
aws kendra list-thesauri \
--index-id index-id
```

要查看同义词库的详细信息，请调用 `describe-thesaurus`：

```
aws kendra describe-thesaurus \
--index-id index-id \
--index-id thesaurus-id
```

要了解同义词库文件的效果，最多可能需要 30 分钟。

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

```
import boto3
from botocore.exceptions import ClientError
import pprint
import time

kendra = boto3.client("kendra")

print("Create a thesaurus")

thesaurus_name = "thesaurus-name"
thesaurus_description = "thesaurus-description"
thesaurus_role_arn = "role-arn"

index_id = "index-id"

s3_bucket_name = "bucket-name"
s3_key = "thesaurus-file"
source_s3_path= {
    'Bucket': s3_bucket_name,
    'Key': s3_key
}

try:
    thesaurus_response = kendra.create_thesaurus(
        Description = thesaurus_description,
        Name = thesaurus_name,
        RoleArn = thesaurus_role_arn,
        IndexId = index_id,
        SourceS3Path = source_s3_path
    )

    pprint.pprint(thesaurus_response)

    thesaurus_id = thesaurus_response["Id"]

    print("Wait for Kendra to create the thesaurus.")

    while True:
        # Get thesaurus description
        thesaurus_description = kendra.describe_thesaurus(
            Id = thesaurus_id,
            IndexId = index_id
        )
        # If status is not CREATING quit
        status = thesaurus_description["Status"]
        print("Creating thesaurus. Status: " + status)
        if status != "CREATING":
            break
        time.sleep(60)

except ClientError as e:
        print("%s" % e)

print("Program ends.")
```

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

```
package com.amazonaws.kendra;

import software.amazon.awssdk.services.kendra.KendraClient;
import software.amazon.awssdk.services.kendra.model.CreateThesaurusRequest;
import software.amazon.awssdk.services.kendra.model.CreateThesaurusResponse;
import software.amazon.awssdk.services.kendra.model.DescribeThesaurusRequest;
import software.amazon.awssdk.services.kendra.model.DescribeThesaurusResponse;
import software.amazon.awssdk.services.kendra.model.S3Path;
import software.amazon.awssdk.services.kendra.model.ThesaurusStatus;

public class CreateThesaurusExample {

  public static void main(String[] args) throws InterruptedException {

    KendraClient kendra = KendraClient.builder().build();

    String thesaurusName = "thesaurus-name";
    String thesaurusDescription = "thesaurus-description";
    String thesaurusRoleArn = "role-arn";

    String s3BucketName = "bucket-name";
    String s3Key = "thesaurus-file";
    String indexId = "index-id";

    System.out.println(String.format("Creating a thesaurus named %s", thesaurusName));
    CreateThesaurusRequest createThesaurusRequest = CreateThesaurusRequest
        .builder()
        .name(thesaurusName)
        .indexId(indexId)
        .description(thesaurusDescription)
        .roleArn(thesaurusRoleArn)
        .sourceS3Path(S3Path.builder()
            .bucket(s3BucketName)
            .key(s3Key)
            .build())
        .build();
    CreateThesaurusResponse createThesaurusResponse = kendra.createThesaurus(createThesaurusRequest);
    System.out.println(String.format("Thesaurus response %s", createThesaurusResponse));

    String thesaurusId = createThesaurusResponse.id();

    System.out.println(String.format("Waiting until the thesaurus with ID %s is created.", thesaurusId));

    while (true) {
      DescribeThesaurusRequest describeThesaurusRequest = DescribeThesaurusRequest.builder()
          .id(thesaurusId)
          .indexId(indexId)
          .build();
      DescribeThesaurusResponse describeThesaurusResponse = kendra.describeThesaurus(describeThesaurusRequest);
      ThesaurusStatus status = describeThesaurusResponse.status();
      if (status != ThesaurusStatus.CREATING) {
        break;
      }

      TimeUnit.SECONDS.sleep(60);
    }

    System.out.println("Thesaurus creation is complete.");
  }
}
```

------

# 更新同义词库
<a name="index-synonyms-update"></a>

在创建同义词库后，您可以更改其配置。您可以更改同义词库名称和 IAM 信息之类的详细信息。您也可以更改同义词库文件位置的 Amazon S3 路径。如果更改同义词库文件的路径，则 Amazon Kendra 会将现有同义词库替换为更新后的路径中指定的同义词库。

要了解更新后的同义词库文件的效果，最多可能需要 30 分钟。

**注意**  
如果同义词库文件中存在验证或语法错误，则会保留之前上传的同义词库文件。

以下过程说明如何修改同义词库的详细信息。

------
#### [ Console ]

**修改同义词库的详细信息**

1. 在左侧导航窗格中要修改的索引下，选择**同义词**。

1. 在**同义词**页面上，选择要修改的同义词库，然后选择**编辑**。

1. 在**更新同义词库**页面上，更新同义词库详细信息。

1. （可选）选择 “**更改同义词库文件路径**”，然后指定新同义词库文件的 Amazon S3 路径。您的现有同义词库文件将替换为您指定的文件。如果不更改路径，则从现有路径 Amazon Kendra 重新加载同义词库。

   如果选择 “**保留当前同义词库文件**”，则 Amazon Kendra 不会重新加载同义词库文件。

1. 选择**保存**以保存配置。

您也可以从现有同义词库路径重新加载同义词库。

**从现有路径重新加载同义词库**

1. 在左侧导航窗格中要修改的索引下，选择**同义词**。

1. 在**同义词**页面上，选择要重新加载的同义词库，然后选择**刷新**。

1. 在**重新加载同义词库文件**页面上，确认要刷新同义词库文件。

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

要更新同义词库，请调用 `update-thesaurus`：

```
aws kendra update-thesaurus \
--index-id index-id \
--name "thesaurus-name" \
--description "thesaurus-description" \
--source-s3-path "Bucket=bucket-name,Key=thesaurus/synonyms.txt" \
--role-arn role-arn
```

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

```
import boto3
from botocore.exceptions import ClientError
import pprint
import time

kendra = boto3.client("kendra")

print("Update a thesaurus")

thesaurus_name = "thesaurus-name"
thesaurus_description = "thesaurus-description"
thesaurus_role_arn = "role-arn"

thesaurus_id = "thesaurus-id"
index_id = "index-id"

s3_bucket_name = "bucket-name"
s3_key = "thesaurus-file"
source_s3_path= {
    'Bucket': s3_bucket_name,
    'Key': s3_key
}

try:
    kendra.update_thesaurus(
        Id = thesaurus_id,
        IndexId = index_id,
        Description = thesaurus_description,
        Name = thesaurus_name,
        RoleArn = thesaurus_role_arn,
        SourceS3Path = source_s3_path
    )
    
    print("Wait for Kendra to update the thesaurus.")

    while True:
        # Get thesaurus description
        thesaurus_description = kendra.describe_thesaurus(
            Id = thesaurus_id,
            IndexId = index_id
        )
        # If status is not UPDATING quit
        status = thesaurus_description["Status"]
        print("Updating thesaurus. Status: " + status)
        if status != "UPDATING":
            break
        time.sleep(60)

except ClientError as e:
        print("%s" % e)

print("Program ends.")
```

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

```
package com.amazonaws.kendra;

import software.amazon.awssdk.services.kendra.KendraClient;
import software.amazon.awssdk.services.kendra.model.UpdateThesaurusRequest;
import software.amazon.awssdk.services.kendra.model.DescribeThesaurusRequest;
import software.amazon.awssdk.services.kendra.model.DescribeThesaurusResponse;
import software.amazon.awssdk.services.kendra.model.S3Path;
import software.amazon.awssdk.services.kendra.model.ThesaurusStatus;

public class UpdateThesaurusExample {

  public static void main(String[] args) throws InterruptedException {

    KendraClient kendra = KendraClient.builder().build();

    String thesaurusName = "thesaurus-name";
    String thesaurusDescription = "thesaurus-description";
    String thesaurusRoleArn = "role-arn";

    String s3BucketName = "bucket-name";
    String s3Key = "thesaurus-file";

    String thesaurusId = "thesaurus-id";
    String indexId = "index-id";

    UpdateThesaurusRequest updateThesaurusRequest = UpdateThesaurusRequest
        .builder()
        .id(thesaurusId)
        .indexId(indexId)
        .name(thesaurusName)
        .description(thesaurusDescription)
        .roleArn(thesaurusRoleArn)
        .sourceS3Path(S3Path.builder()
            .bucket(s3BucketName)
            .key(s3Key)
            .build())
        .build();
    kendra.updateThesaurus(updateThesaurusRequest);

    System.out.println(String.format("Waiting until the thesaurus with ID %s is updated.", thesaurusId));

    // a new source s3 path requires re-consumption by Kendra 
    // and so can take as long as a Create Thesaurus operation
    while (true) {
      DescribeThesaurusRequest describeThesaurusRequest = DescribeThesaurusRequest.builder()
          .id(thesaurusId)
          .indexId(indexId)
          .build();
      DescribeThesaurusResponse describeThesaurusResponse = kendra.describeThesaurus(describeThesaurusRequest);
      ThesaurusStatus status = describeThesaurusResponse.status();
      if (status != ThesaurusStatus.UPDATING) {
        break;
      }

      TimeUnit.SECONDS.sleep(60);
    }

    System.out.println("Thesaurus update is complete.");
  }
}
```

------

# 更新同义词库
<a name="index-synonyms-delete"></a>

以下过程说明如何删除同义词库。

------
#### [ Console ]

1. 在左侧导航窗格中要修改的索引下，选择**同义词**。

1. 在**同义词**页面上，选择要删除的同义词库。

1. 在**同义词库详细信息**页面上，选择**删除**，然后确认删除。

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

要使用将同义词删除到索引中 AWS CLI，请调用：`delete-thesaurus`

```
aws kendra delete-thesaurus \
--index-id index-id \
--id thesaurus-id
```

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

```
import boto3
from botocore.exceptions import ClientError

kendra = boto3.client("kendra")

print("Delete a thesaurus")

thesaurus_id = "thesaurus-id"
index_id = "index-id"

try:
    kendra.delete_thesaurus(
        Id = thesaurus_id,
        IndexId = index_id
    )

except ClientError as e:
        print("%s" % e)

print("Program ends.")
```

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

```
package com.amazonaws.kendra;

import software.amazon.awssdk.services.kendra.KendraClient;
import software.amazon.awssdk.services.kendra.model.DeleteThesaurusRequest;

public class DeleteThesaurusExample {

  public static void main(String[] args) throws InterruptedException {

    KendraClient kendra = KendraClient.builder().build();

    String thesaurusId = "thesaurus-id";
    String indexId = "index-id";

    DeleteThesaurusRequest updateThesaurusRequest = DeleteThesaurusRequest
        .builder()
        .id(thesaurusId)
        .indexId(indexId)
        .build();
    kendra.deleteThesaurus(updateThesaurusRequest);
  }
}
```

------

# 在搜索结果中突出显示
<a name="index-synonyms-enabling-synonyms-in-results"></a>

默认情况下，突出显示同义词处于启用状态。亮点信息包含在 Amazon Kendra SDK 和 CLI 查询结果中。如果您 Amazon Kendra 使用 SDK 或 CLI 进行交互，则由您决定如何显示结果。

同义词突出显示将使用突出显示类型 `THESAURUS_SYNONYM`。有关突出显示的更多信息，请参阅[突出显示](https://docs.aws.amazon.com/kendra/latest/APIReference/API_Highlight.html)对象。