Amazon Neptune 中的全文搜索查询执行 - Amazon Neptune

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

Amazon Neptune 中的全文搜索查询执行

在包含全文搜索的查询中,Neptune 尝试首先将全文搜索调用放在查询的其它部分之前。这减少了对 OpenSearch 的调用次数,并且在大多数情况下显著提高了性能。然而,这绝非硬性规定。例如,在某些情况下,PatternNodeUnionNode 可能在全文搜索调用之前。

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

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

如果此查询按步骤出现的顺序执行,则 10 万个解将流入 OpenSearch,从而导致数百个 OpenSearch 调用。实际上,Neptune 先调用 OpenSearch,然后将结果与 Neptune 的结果联接起来。在大多数情况下,这比按原始顺序执行查询要快得多。

您可以使用 noReordering 查询提示防止查询步骤执行采用这种重新排序:

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 查询提示禁止此行为:

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 . } }

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