

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

# Neptune 全文搜索参数
<a name="full-text-search-parameters"></a>

Amazon Neptune 使用以下参数在 Gremlin 和 SPARQL 中指定全文 OpenSearch 查询：
+ **`queryType`** –（*必需*）OpenSearch 查询的类型。（有关查询类型的列表，请参阅 [OpenSearch 文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html)）。Neptune 支持以下 OpenSearch 查询类型：
  + [simple\$1query\$1string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html) – 基于提供的查询字符串返回文档，使用具有有限但容错的 Lucene 语法的分析器。这是默认查询类型。

    此查询使用简单的语法来解析提供的查询字符串并将其拆分为基于特殊运算符的词条。然后，查询会在返回匹配文档之前独立分析每个词条。

    虽然其语法比 `query_string` 查询更有限，但 `simple_query_string` 查询不会返回无效语法的错误。相反，它忽略查询字符串的任何无效部分。
  + [match](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html) – `match` 查询是执行全文搜索的标准查询，包括模糊匹配的选项。
  + [prefix](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html) – 返回在指定字段中包含特定前缀的文档。
  + [fuzzy](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html) – 如果文档包含与搜索词相似的词条（相似度用 Levenshtein 编辑距离衡量），则返回该文档。

    编辑距离是将一个词条转换为另一个词条所需的单字符更改数。这些更改可包括：
    + 更改一个字符（box 更改为 fox）。
    + 删除一个字符（black 更改为 lack）。
    + 插入一个字符（sic 更改为 sick）。
    + 转置两个相邻的字符（act 更改为 cat）。

    查找相似词条时，fuzzy 查询会在指定的编辑距离内为搜索词创建所有可能变体和扩展，然后返回每个变体的精确匹配。
  + [term](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) – 如果文档的指定字段之一包含指定词条的精确匹配，则返回该文档。

    您可以使用 `term` 查询基于精确值（如价格、产品 ID 或用户名）查找文档。
**警告**  
避免对文本字段使用 term 查询。默认情况下，作为分析的一部分，OpenSearch 会更改文本字段的值，这会使得很难找到文本字段值的精确匹配。  
要搜索文本字段值，请改用 match 查询。
  + [query\$1string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html) – 基于提供的查询字符串返回文档，使用具有严格语法（Lucene 语法）的分析器。

    此查询使用语法来解析和拆分基于运算符（如 AND 或 NOT）提供的查询字符串。然后，查询会在返回匹配文档之前独立分析每个拆分文本。

    您可以使用 `query_string` 查询创建复杂的搜索，其中包括通配符、跨多个字段的搜索等。虽然查询灵活多变，但它是严格的，如果查询字符串包含任何无效语法，则会返回错误。
**警告**  
由于它对任何无效语法返回错误，因此我们不建议对搜索框使用 `query_string` 查询。  
如果您不需要支持查询语法，请考虑使用 `match` 查询。如果您需要查询语法的功能，请使用不太严格的 `simple_query_string` 查询。
+ **`field`** – OpenSearch 中用来运行搜索的字段。只有在 `queryType` 允许它（如 `simple_query_string` 和 `query_string` 那样）时才能省略此项，在这种情况下，搜索针对所有字段。在 Gremlin 中，这是隐式的。

  如果查询允许，则可以指定多个字段，如 `simple_query_string` 和 `query_string` 查询。
+ **`query`** –（*必需*）要针对 OpenSearch 运行的查询。此字段的内容可能因 queryType 而异。不同的 queryType 接受不同的语法，如 `Regexp`。在 Gremlin 中，`query` 是隐式的。
+ **`maxResults`** – 要返回的最大结果数量。默认为 `index.max_result_window` OpenSearch 设置，该设置本身默认为 10000。`maxResults` 参数可以指定小于该值的任意数字。
**重要**  
如果您将 `maxResults` 的值设置为高于 OpenSearch `index.max_result_window` 值，并且尝试检索的结果数超过 `index.max_result_window` 的值，则 OpenSearch 将失败，并显示 `Result window is too large` 错误。但是，Neptune 正常处理这个问题，而不会传播错误。如果您试图提取的结果数超过 `index.max_result_window` 的值，请记住这一点。
+ **`minScore`** – 返回的搜索结果必须具有的最低分数。有关结果评分的说明，请参阅 [OpenSearch 相关性文档](https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html)。
+ **`batchSize`** – Neptune 始终以批量方式提取数据（默认批量大小为 100）。您可以使用此参数来优化性能。批量大小不能超过 `index.max_result_window` OpenSearch 设置，该设置默认为 10000。
+ **`sortBy`** – 一个可选参数，允许您按以下选项之一对 OpenSearch 返回的结果进行排序：
  + *文档中的特定字符串字段* –  

    例如，在 SPARQL 查询中，您可以指定：

    ```
        neptune-fts:config neptune-fts:sortBy foaf:name .
    ```

    在类似的 Gremlin 查询中，您可以指定：

    ```
        .withSideEffect('Neptune#fts.sortBy', 'name')
    ```
  + *文档中的特定非字符串字段（`long`、`double` 等）* –  

    请注意，对非字符串字段进行排序时，需要在字段名称后面追加 `.value`，以将其与字符串字段区分开来。

    例如，在 SPARQL 查询中，您可以指定：

    ```
        neptune-fts:config neptune-fts:sortBy foaf:name.value .
    ```

    在类似的 Gremlin 查询中，您可以指定：

    ```
        .withSideEffect('Neptune#fts.sortBy', 'name.value')
    ```
  + `score` – 按匹配得分排序（默认）。

    如果 `sortOrder` 参数存在但 `sortBy` 不存在，则 `score` 按照由 `sortOrder` 指定的顺序对结果进行排序。
  + `id` – 按 ID 排序，这意味着 SPARQL 主题 URI 或 Gremlin 顶点或边缘 ID。

    例如，在 SPARQL 查询中，您可以指定：

    ```
        neptune-fts:config neptune-fts:sortBy 'Neptune#fts.entity_id' .
    ```

    在类似的 Gremlin 查询中，您可以指定：

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_id')
    ```
  + `label` – 按标签排序。

    例如，在 SPARQL 查询中，您可以指定：

    ```
        neptune-fts:config neptune-fts:sortBy 'Neptune#fts.entity_type' .
    ```

    在类似的 Gremlin 查询中，您可以指定：

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_type')
    ```
  + `doc_type` – 按文档类型（即 SPARQL 或 Gremlin）排序。

    例如，在 SPARQL 查询中，您可以指定：

    ```
        neptune-fts:config neptune-fts:sortBy 'Neptune#fts.document_type' .
    ```

    在类似的 Gremlin 查询中，您可以指定：

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.document_type')
    ```

  默认情况下，OpenSearch 结果不进行排序，它们的顺序是不确定的，这意味着同一个查询在每次运行时都可能以不同的顺序返回项目。因此，如果结果集大于 `max_result_window`，则每次运行查询时都会返回总结果的一个非常不同的子集。但是，通过排序，您可以使不同运行的结果变得可更直接地进行比较。

  如果没有 `sortOrder` 参数随附 `sortBy`，则使用从最大到最小的降序 (`DESC`)。
+ **`sortOrder`** – 一个可选参数，用于指定 OpenSearch 结果是从最小到最大，还是从最大到最小排序（默认）：

****
  + `ASC` – 升序，从最小到最大。
  + `DESC` – 降序，从最大到最小。

    这是默认值，当 `sortBy` 参数存在但未指定 `sortOrder` 时使用。

  如果既不存在 `sortBy` 也不存在 `sortOrder`，则默认情况下不会对 OpenSearch 结果进行排序。