

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

# Full-text-search 在 Amazon Neptune 中执行查询
<a name="full-text-search-query-execution"></a>

在包含 full-text-search的查询中，Neptune 尝试将调 full-text-search用放在第一位，然后再排在查询的其他部分之前。这减少了呼叫次数， OpenSearch 而且在大多数情况下可以显著提高性能。但是，这绝不是 hard-and-fast规则。例如，在某些情况下，`PatternNode` 或 `UnionNode` 可能在全文搜索调用之前。

假设对包含 10 万个 `Person` 实例的数据库进行以下 Gremlin 查询：

```
g.withSideEffect('Neptune#fts.endpoint', 'your-es-endpoint-URL')
 .hasLabel('Person')
 .has('name', 'Neptune#fts marcello~');
```

如果按照步骤出现的顺序执行此查询，则将流入 100,000 个解决方案 OpenSearch，从而导致数百个 OpenSearch 调用。实际上，海王星 OpenSearch 先调用，然后将结果与海王星的结果连接起来。在大多数情况下，这比按原始顺序执行查询要快得多。

您可以使用 [noReordering 查询提示](gremlin-query-hints-noReordering.md)防止查询步骤执行采用这种重新排序：

```
g.withSideEffect('Neptune#fts.endpoint', 'your-es-endpoint-URL')
 .withSideEffect('Neptune#noReordering', true)
 .hasLabel('Person')
 .has('name', 'Neptune#fts marcello~');
```

在第二种情况下，首先执行 `.hasLabel` 步骤，其次执行 `.has('name', 'Neptune#fts marcello~')` 步骤。

对于另一个示例，假设针对相同类型的数据进行 SPARQL 查询：

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT ?person WHERE {
  ?person rdf:type foaf:Person .
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'mike' .
    neptune-fts:config neptune-fts:return ?person .
  }
}
```

再次，Neptune 首先执行查询的 `SERVICE` 部分，然后将结果与 `Person` 数据联接。您可以使用 [joinOrder 查询提示](sparql-query-hints-joinOrder.md)禁止此行为：

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT ?person WHERE {
  hint:Query hint:joinOrder "Ordered" .
  ?person rdf:type foaf:Person .
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'mike' .
    neptune-fts:config neptune-fts:return ?person .
  }
}
```

同样，在第二个查询中，查询的各个部分按照它们在查询中显示的顺序执行。

**注意**  
 不直接查询 OpenSearch 索引而通过索引查询 OpenSearch 别名，可能会产生不正确的结果。您应该直接查询 OpenSearch 索引，而不是别名。