Couchbase Server フルテキストサーチ（全文検索）機能解説① インデックスの作成（ターゲット選択）

## インデックスの作成
Couchbase Serverの全文検索機能は、専用のインデックスによって実現されます。インデックスは、Webコンソール、またはREST APIを使用して作成できます。いずれの方法でも作成時に設定する内容は共通です。ここではWebコンソールから作成する手順に沿って、解説します。

## ターゲット選択の概要
全文検索インデックスを作成するには、まず検索の対象となるデータの範囲を指定します。
Couchbase Serverのバケットに格納されているドキュメントに対してインデックス化のターゲットを指定します。

- ターゲットは、ドキュメントIDまたはドキュメントの特定のフィールドの値に基づいて、さまざまなタイプ（エンティティ）にグループ化できます。これを**ドキュメントタイプ**と呼びます。
- 各ドキュメントタイプには、独自の**インデックスマッピング**を割り当てることができます。
- また、**インデックスエイリアス**を使って、複数のバケットに跨がる検索を実行することもできます。

## 作成済みインデックスの管理
全文検索インデックスは、Web管理コンソールの左側のナビゲーションパネルの[Search]タブからアクセスします(他に、[Index]タブがありますが、こちらは、N1QLクエリ用のインデックスです)。
[Search]タブをクリックすると、全文検索パネルが表示されます。このパネルには、作成済みのインデックスが表示されます。
インデックスを管理するには、その行をクリックします。次のように展開されます。

![ftsインデックス管理UI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/1cac1044-1a87-e4aa-8104-420a106e936a.png)

右端に、3つのボタンが表示されてます。

- [Delete]をクリックすると、 インデックスが削除されます。
- [Clone]をクリックすると、[Clone Index]画面が表示されます。そのインデックスのコピーを作成し、必要に応じて変更を加え、新しい名前で保存できます。
- [Edit]をクリックすると、[Edit Index]画面が表示され、インデックスを変更できます。変更を保存すると、インデックスが再構築されます。


[Edit Index]画面と[Clone Index]画面はどちらも、多くの部分において、[Add Index]画面と似ています。

## インデックス作成・編集

### タイプ識別子の指定
インデックスによって、バケット内の文書は、そのタイプ識別子に従って識別することができます。[Add Index]（または、[Edit Index], [Clone Index]） にアクセスすると、タイプ識別子(Type Identifier)パネルが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/f735545e-f3fc-7876-5aaa-5b097e260c75.png)


バケット内の各ドキュメントのタイプを判別する方法として、3つのオプションが用意されています。

- **JSON type field：** ドキュメントの特定のフィールドの値を用いてタイプを認識します。デフォルト値は「type」です。値を配列またはJSONオブジェクトにすることはできません。

- **Doc ID up to separator:** 区切り文字を使ってドキュメントのIDの一部をタイプとして認識します。設定時に入力する値は、IDで使用されている区切り文字です（区切り文字は結果に含まれません）。たとえば、ドキュメントのIDが「hotel_10123」である場合、値「hotel」をドキュメントのタイプとして利用することが考えられますが、この場合は、「_」が区切り文字になります。

- **Doc ID with regex:** 正規表現を使ってドキュメントのIDの一部をタイプとして認識します。このオプションは、対象のドキュメントに適切なフィールドが含まれておらず、またセパレータの利用に適した命名規則に従ったIDも使われていない場合に使用できます。

### タイプマッピングの指定

タイプ識別子が、インデックス化する文書の種類を決定するのに対して、タイプマッピングは、検索対象データそのものを決定します。

はじめに、タイプマッピングのパネルを開くと、デフォルト設定が表示されます。


![ftsタイプマッピングUIが閉じています](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/8699b1f0-c382-fd8d-9d33-0e2c0012884d.png)

この表示は、一つのタイプマッピングが既に定義されていることを示しています。これは特殊なタイプのマッピングです。このデフォルトのマッピングを有効のままにすると、ユーザーが他のタイプマッピングを指定したかどうかに関係なく、すべてのドキュメントがインデックスに含まれることになります。ユーザーが指定したタイプマッピングに対応するドキュメントのみがインデックス化されるようにするには、このデフォルトのタイプマッピングを無効にする必要があります。


[ +Add Type Mapping]ボタンをクリックします。ディスプレイは次のように表示されます。

![ftsタイプマッピングUI追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/085201f4-743e-5a01-59ed-d9ec59982f1f.png)


タイプマッピングを指定するには、テキストフィールドに適切な文字列（たとえば「hotel」）を入力します。

[only index specified fields]チェックボックスに注意してください。これをオンにすると、ドキュメント内のユーザーによって指定されたフィールドのみがインデックスに含まれるようになります。

チェックしない場合、このマッピングは「動的(dynamic)」なものとして扱われます。動的マッピングでは、ドキュメント内のすべてのフィールドがインデックス作成に使用されることを意味します。全文検索の一般的な要件を考えると、動的マッピングでインデックスを作成することは、リソースのオーバーヘッドに繋がるため、特に本番利用においては、不適切といえます。

### アナライザー設定
テキストフィールドの右隣の項目は、このタイプマッピングに利用される**アナライザー**を示します。プルダウンメニューを使用して、使用可能なアナライザーのリストにアクセスできます。


![ftsタイプマッピングUIアナライザーメニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/d74f0170-12bb-0ebb-63eb-5470b8351bf7.png)

デフォルト値である「inherit（継承）」は、このタイプマッピングがクラスターのデフォルトのアナライザーを継承することを意味します。アナライザーについては、別途説明するため、ここでは、これ以上の詳細には立ち入りません。

新しく作成したタイプマッピングの[only index specified fields]にチェックを入れずに[ok]ボタンを押して保存すると、次のように表示されます。

![ftsタイプマッピングUI追加の両方チェック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/c446cade-dc6d-620d-078d-b647759fcd42.png)


指定された2つのタイプマッピングhotelおよびdefaultのそれぞれの左側にあるチェックボックスがチェックされていることに注意してください。インデックスに、hotelドキュメントのみが含まれるようにするには、defaultチェックボックスをオフにします。


### フィールドの指定
インデックスのターゲットには、特定のタイプのドキュメントを指定するだけでなく、ドキュメントのフィールドを定義できます。

フィールドを指定するには、[Type Mappings]パネルの有効なタイプマッピングを含む行にマウスカーソルを合わせます。「edit」および「+」というラベルの付いたボタンが表示されます。


![ftsタイプマッピングUIフィールドボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/c9192d87-a5c2-ec51-4117-2ee5ae228fd6.png)

[edit]ボタンをクリックすると、次の画面が表示されます。

![ftsタイプマッピングUI編集](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/ca1c146f-9109-9ec6-394f-2b65c38f02c8.png)


編集モードでは、作成時の定義を変更できる他、そのマッピングを削除することができます。

[+]ボタンをクリックすると、次の2つのオプションを備えたポップアップが表示されます。

- insert child mapping
- insert child field

![ftsタイプマッピングUIフィールドオプション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/25187207-17df-4da8-3a94-f65105184664.png)



### 子フィールドの挿入
[insert child mapping]オプションを使用すると、インデックスにフィールドを個別に指定することができます。そのフィールドの値がJSONオブジェクトではなく、単一の値または配列である場合に、このオプションを使用します（値がJSONオブジェクトであるケースについては後述します）。このオプションを選択すると、次のように表示されます。


![ftsタイプマッピング子フィールドダイアログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/70c6d9c5-51c5-781d-2681-3eaafb606a45.png)


- **field：** ドキュメント内のフィールドの名前。このフィールドの値は、JSONオブジェクトではなく、単一の値または配列である必要があります。

- **type：** フィールドの値のデータ型。これは、`text`、`number`、`datetime`、`boolean`、`disabled`、または`geopoint`に、することができ、次のように、プルダウンメニューから選択できます。


![ftsタイプマッピングuiselectデータタイプ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/23815f76-5a27-8196-9438-9ba7172378c4.png)

- **searchable as：** 通常は`field`と同じ値になります（`field`値のテキスト入力中に動的にコピーされます）。この値を変更して、別の名前を定義することができます。これにより、インデックス付きコンテンツに含まれるフィールドが変化します。

- **analyzer：** このフィールドに使用されるアナライザー

指定されたフィールドの値が配列の場合、配列値すべてに対して、インデックスが付けられます。


最下部には、複数のチェックボックスが存在し、それぞれは、以下の意味を持ちます。

- **index:** フィールドのインデックスが作成されます。指定したフィールドが既に定義されている場合、チェックを外すことによって明示的にインデックス化の対象から外すことができます。
- **Store:** 検索結果の値のセットにフィールドコンテンツを含めます。フィールドコンテンツは、検索結果の一致した部分を強調表示するために必要な情報を格納しています。
- **Include in _all field:**　チェックすると、そのフィールドは（予め定義されている）`_all`定義に含まれます。これは、プレフィックスを必要とせずにテキストのみを使って検索できることを意味します（つまり、`description:modern`ではなく、`modern`のみで検索できます）。
- **Include term vectors:** インデックスにタームベクターを含めるかどうかを決定できます。強調表示やフレーズ検索などの特定の種類の検索にはタームベクターが必要になります。
- **docvalues:**  オンの場合、フィールドの値をインデックスに含めることができます。これによって、検索ファセット、およびフィールド値に基づく検索結果の並べ替えがサポートされます。デフォルトでオンになっています。


全て入力すると、ダイアログは次のようになります。

![ftsタイプマッピングの子フィールドダイアログが完了しました](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/7769f85d-827d-8aca-4e5a-d00f85f5861f.png)



[OK]をクリックします。フィールドが保存され、追加した項目が新しい行に表示されます。


![保存されたftsタイプマッピングの子フィールド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/2c03bfb8-95ae-60e7-bb8e-93e450e72e3a.png)


### 子マッピングの挿入

子マッピングの挿入では、値がJSONオブジェクトであるドキュメントフィールドを指定します。このオプションを選択すると、次のように表示されます。


![ftsタイプマッピング子マッピングダイアログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/58a681fb-c915-f6d7-0123-cb9a140d722a.png)

次のフィールドが表示されます。

- {}：値がJSONオブジェクトであるフィールドの名前

その他の項目については、これまで説明した通りです。

完了すると、このパネルは次のようになります。reviewsは、travel-sampleバケットのhotelタイプのドキュメントに含まれるフィールドであり、その値はJSONオブジェクトであることに注意してください。


![ftsタイプマッピング子マッピングダイアログが完了しました](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/dd0f7694-5c3c-8d44-c172-bb54fb6070d3.png)


[OK]をクリックして保存します。これで、フィールドがhotelタイプマッピングの一部として表示されます。さらにこの配下に、contentなどの子フィールドを指定できます。


![ftsタイプマッピング子マッピング追加フィールド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/4b2e78e7-7838-cc8e-115c-b577dc41cbc3.png)


# 関連情報

[Creating Indexes](https://docs.couchbase.com/server/current/fts/fts-creating-indexes.html)

[Full Text Search: Fundamentals](https://docs.couchbase.com/server/current/fts/full-text-intro.html)