

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 查詢會在指定的編輯距離內建立一組搜尋字詞所有可能的變異和擴展，然後傳回這些 variant 每一個的完全相符項目。
  + [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 而有所不同。不同的 queryTypes 接受不同的語法，例如，`Regexp`。在 Gremlin 中，`query` 是隱含的。
+ **`maxResults`** – 要傳回的結果數量上限。預設值是 `index.max_result_window` OpenSearch 設定，本身預設為 10,000。`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 設定，預設為 10,000。
+ **`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` 不存在，則會依 `sortOrder` 指定的順序由 `score` 排序結果。
  + `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 結果。