

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Neptune でのフルテキスト検索クエリの実行
<a name="full-text-search-query-execution"></a>

フルテキスト検索を含むクエリでは、Neptune は、フルテキスト検索呼び出しを、クエリの他の部分より前となる、最初に配置しようとします。これにより、OpenSearch への呼び出し回数が減り、ほとんどの場合、パフォーマンスが大幅に向上します。しかし、これは決して厳格なルールではありません。たとえば、次のような状況があります。`PatternNode` または `UnionNode` がフルテキスト検索コールの前に表示されることがあります。

次の Gremlin クエリを 100,000 個の `Person` インスタンスを含むデータベースに対して行うとします。

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

このクエリがステップが表示される順序で実行された場合、100,000 のソリューションが OpenSearch に流れ、大量の OpenSearch 呼び出しが発生します。実際、Neptune は最初に OpenSearch を呼び出し、結果を Neptune 結果と結合します。ほとんどの場合、これは元の順序でクエリを実行するよりもはるかに高速です。

[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~');
```

この 2 番目のケースでは、`.hasLabel` ステップが最初に実行され、`.has('name', 'Neptune#fts marcello~')` ステップは 2 番目に実行されます。

別の例として、同じ種類のデータに対する 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 .
  }
}
```

ここでも、2 番目のクエリでは、パーツはクエリに表示される順序で実行されます。

**注記**  
 OpenSearch インデックスを直接クエリする代わりに、インデックスで OpenSearch エイリアスをクエリすると、誤った結果が生じる可能性があります。クエリはエイリアスではなく、OpenSearch インデックスを直接対象にする必要があります。