`Ctrl`+`K`

# 7.15.18. `query_parallel_or`

バージョン 11.0.1 で追加.

## 7.15.18.1. 概要

`query_parallel_or` は query と似ていますが、 `query_parallel_or` は複数の `OR` 条件を並列に処理します。

## 7.15.18.2. 構文

`query_parallel_or` は2つ以上の引数が必要です。 `match_columns` と1つ以上の `query_string` です。

`options` 引数は省略可能です。

    query(match_columns, query_string0, query_string1, ..., query_stringN)
    query(match_columns, query_string0, query_string1, ..., query_stringN, options)

少なくとも1つ `query_string` を指定しなければいけません。

`options` には以下のキーを指定します。すべてのキー・値のペアは省略可能です。:

    {
      "expander": query_expander,
      "default_mode": default_mode,
      "default_operator": default_operator,
      "flags": flags
    }

## 7.15.18.3. 使い方

使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。

サンプルスキーマ:

実行例:

    table_create Documents TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Documents content COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram  --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms documents_content_index COLUMN_INDEX|WITH_POSITION Documents content
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Users TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Users name COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Users memo COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Lexicon TABLE_HASH_KEY ShortText \
      --default_tokenizer 'TokenNgram("unify_alphabet", false)' \
      --normalizer NormalizerNFKC130
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Lexicon users_name COLUMN_INDEX|WITH_POSITION Users name
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Lexicon users_memo COLUMN_INDEX|WITH_POSITION Users memo
    # [[0, 1337566253.89858, 0.000355720520019531], true]

サンプルデータ:

実行例:

    load --table Users
    [
    {"name": "Alice", "memo": "Groonga user"},
    {"name": "Alisa", "memo": "Mroonga user"},
    {"name": "Bob",   "memo": "Rroonga user"},
    {"name": "Tom",   "memo": "Nroonga user"},
    {"name": "Tobby", "memo": "Groonga and Mroonga user. Mroonga is ..."}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 5]

以下は `query_parallel_or` 関数で並列に複数の全文検索を実行する例です。

実行例:

    select Users \
      --output_columns name,memo,_score \
      --filter 'query_parallel_or("name * 10 || memo", "alice", "Groonga")'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "name",
    #           "ShortText"
    #         ],
    #         [
    #           "memo",
    #           "ShortText"
    #         ],
    #         [
    #           "_score",
    #           "Int32"
    #         ]
    #       ],
    #       [
    #         "Alice",
    #         "Groonga user",
    #         11
    #       ],
    #       [
    #         "Tobby",
    #         "Groonga and Mroonga user. Mroonga is ...",
    #         1
    #       ]
    #     ]
    #   ]
    # ]

この `select` コマンドは以下の全文検索を実行しなければいけません。

> - `name` から `"alice"` を全文検索

> - `memo` から `"alice"` を全文検索

> - `name` から `"Groonga"` を全文検索

> - `memo` から `"Groonga"` を全文検索

さらに、これらのすべての結果セットは `OR` で結合する必要があります。

`query` 関数はこれらを順番に実行します。 `query_parallel_or` 関数はこれらを並列に実行します。どちらの結果セットも同じになります。

## 7.15.18.4. 引数

### 7.15.18.4.1. 必須引数

必須引数は二つあります。 `match_columns` と `query_string` です。

#### 7.15.18.4.1.1. `match_columns`

`query_string` パラメーターの値で全文検索するときのデフォルトの検索対象カラムを指定します。このパラメーターは `select` の match_columns パラメーターと同じ役割です。

検索対象カラムとクエリー文字列の各ペアは並列に処理されます。たとえば、 `query_parallel_or("C1 || C2 || C3", "Q1", "Q2")` には次のペアがあります。

> - `C1 @ "Q1"`

> - `C2 @ "Q1"`

> - `C3 @ "Q1"`

> - `C1 @ "Q2"`

> - `C2 @ "Q2"`

> - `C3 @ "Q2"`

各ペアは並列に処理されます。並列度はシステムによります。デフォルトの最大スレッド数は `CPUスレッド数 / 3` です。

#### 7.15.18.4.1.2. `query_string`

クエリー構文 で検索条件を指定します。このパラメーターは `select` コマンドの `query` パラメーターと同じ役割です。

`select` コマンドの `query` については match_columns を参照してください。

並列に全文検索するために複数の `query_string` を指定できます。どのように並列化されるかは match_columns を参照してください。

### 7.15.18.4.2. 省略可能引数

いくつか省略可能な引数があります。

#### 7.15.18.4.2.1. `query_expander`

詳細は query_expander を見てください。

#### 7.15.18.4.2.2. `default_mode`

詳細は default_mode を見てください。

#### 7.15.18.4.2.3. `default_operator`

詳細は default_operator を見てください。

#### 7.15.18.4.2.4. `flags`

詳細は flags を見てください。

## 7.15.18.5. 戻り値

この関数は対象レコードがマッチしたかどうかを真偽値で返します。

この関数はセレクターとしても動きます。つまり、効率的に実行できるということです。

## 7.15.18.6. 参考

- select

- query