---
title: キーワード検索用文字列を用意する
description: コンテンツの項目とは別に、キーワード検索で検索対象となる文字列を用意することが可能です。今回はコンテンツに紐づいたメンバーのプロフィールが検索対象となるように設定します。
---

## 概要
コンテンツの項目とは別に、全文検索用の文字列を用意できます。  
全文検索用の文字列はコンテンツ定義のキーワードテンプレートでSmartyを使って設定できるため、登録されたコンテンツの中から検索に使う文字列を追加・削除したり、関連情報でコンテンツに紐づく別のコンテンツやメンバー情報を検索用の文字列に追加したりできます。  
また、キーワード検索時にこのテンプレートのみを利用するようになるため、検索のパフォーマンスが向上します。

今回は講演会のスケジュールをテーマに、コンテンツに紐づいたメンバーのプロフィールが検索対象となるように設定します。

### 学べること
以下の手順でキーワードテンプレートの設定と確認をします。  
- [コンテンツの準備をする](#コンテンツの準備をする)
- [検索対象の文字列を設定する](#検索対象の文字列を設定する)
- [動作の確認をする](#動作の確認をする)

## コンテンツの準備をする
コンテンツとメンバーに必要な項目を設定します。

### コンテンツ定義の作成
[コンテンツ定義を作成する](/ja/docs/tutorials/adding-a-topics/)を参考に、全文検索対象とするコンテンツ定義を作成します。  
今回は講演会のスケジュールを想定し、以下の通りコンテンツ定義を作成しました。

基本項目

|項目名|内容|
|:---|:---|
|名前|講演会|

![Image from Gyazo](https://t.gyazo.com/teams/diverta/1f9ce0f6e35171e043fd3d30287437ae.png)


項目設定

|項目名|項目設定|項目設定オプション|
|:---|:---|:---|
|登壇者|関連情報選択|モジュール: メンバー|
|開催日時|日付フォーマット|時間(hh:mm)も設定する|
|テーマ|テキスト||
|オンライン配信|streaming|単一選択<br/>0: オンライン配信なし<br/>1: オンライン配信あり<br/>入力制限: 入力必須<br/>カスタムテンプレート: ラジオボタンを利用する|

![Image from Gyazo](https://t.gyazo.com/teams/diverta/7a2d448f49109f71ca2f01ab1ec1db07.png)

内容

![Image from Gyazo](https://t.gyazo.com/teams/diverta/52f6e9e6871062c1bd72aa6315878362.png)

登壇者

![Image from Gyazo](https://t.gyazo.com/teams/diverta/eca819de7f9e44de864f02e5c7b4a442.png)

開催日時

![Image from Gyazo](https://t.gyazo.com/teams/diverta/2e78876c2a76432d4d2956ecf257f135.png)

テーマ

![Image from Gyazo](https://t.gyazo.com/teams/diverta/620d458b6e6488e495d0927f6447612f.png)

オンライン配信

![Image from Gyazo](https://t.gyazo.com/teams/diverta/986ec9d6cbbb425f498ad521e91856e3.png)
![Image from Gyazo](https://t.gyazo.com/teams/diverta/3ee67dd45284f983c0de22d3e4ab3f2c.png)
![Image from Gyazo](https://t.gyazo.com/teams/diverta/4a7cd6c756ce9719d77ef16039ea5f0a.png)

### メンバー拡張項目の設定
[拡張項目設定](/ja/docs/management/extra-information/)及び[メンバー詳細設定で利用できる拡張項目一覧](/ja/docs/reference/list-of-extra-column-available-on-member-field-settings/)を参考に、項目を設定します。
今回は講演会の登壇者を想定し、以下の通り拡張項目を追加しました。

フィールド

|項目名|識別子|設定|
|:---|:---|:---|
|公開プロフィール|publish_profile|テキストエリア|

![Image from Gyazo](https://t.gyazo.com/teams/diverta/8b03fa29cc46d7adfe3e23fbaf70d0f3.png)

## 検索対象の文字列を設定する

### 検索対象文字列テンプレートの確認
デフォルトでは、
- topics_id
- slug
- タイトル
- 内容
- カテゴリ
- 全ての拡張項目のテキスト部分
が検索対象となるテンプレートが入力されています。

:::info
初期状態に戻したい場合は空で更新することで、自動的にデフォルトテンプレートが入力されます。
:::

#### リファレンス
利用できる変数は以下の通りです。

|変数名|型|説明|
|:---|:---|:---|
|$details|Object|コンテンツ詳細|
|$ext_config|Object|コンテンツ拡張設定|

Smartyの記述によって出力された文章が全文検索の対象となります。


### 検索対象文字列テンプレートの修正
「[コンテンツ定義の作成](#コンテンツ定義の作成)」で追加したコンテンツ定義のテンプレートを変更します。
今回の例では、以下を検索対象文字列に含むように追加しています。
- タイトル
- 関連情報に紐づくメンバー情報の名前と公開プロフィール
- 開催日時をフォーマットしたもの
- テーマ
- オンライン配信のラベル部分

関連情報に紐づくメンバー情報の取得については、[カスタム処理からKurocoのAPIを呼び出せますか？](/ja/docs/faq/how-to-request-kuroco-api-from-smarty-function/)を参考にしてください。

デフォルトの設定はすべて削除して、以下のように記述します。

```Smarty
{* タイトル *}
{$details.subject|escape}

{* 登壇者 *}
{if $details.presenter.module_type eq 'member' && $details.presenter.module_id}
    {capture name=method_params}{ldelim}
        "filter": "member_id eq {$details.presenter.module_id}"
    {rdelim}{/capture}
    {assign var=method_params value=$smarty.capture.method_params|json_decode:1}
    {api_method
        var=member_list
        model="Member"
        method="list"
        version="1"
        method_params=$method_params
    }
    {foreach from=$member_list.list item=member}
        {* 氏名 *}
        {$member.name1|escape} {$member.name2|escape}
        {* 公開プロフィール *}
        {$member.publish_profile|escape}
    {/foreach}
{/if}

{* 開催日時 *}
{$details.date|strtotime|date_format:"Y/m/d H:i"}
{$details.date|strtotime|date_format:"Y年m月d日 H時i分"}

{* テーマ *}
{$details.thema|escape}

{* オンライン配信 *}
{if $details.streaming.key > 0}
    {$details.streaming.label}
{/if}

{* 内容 *}
{$details.contents|strip_tags|escape}

```

![Image from Gyazo](https://t.gyazo.com/teams/diverta/cc8e9428ccde49c9bad834a2c757c2b7.jpg)

### 検索対象文字列テンプレートを保存する 
処理の記述が完了したら、[更新する] ボタンをクリックして保存します。
以上で設定は完了です。

コンテンツを追加・更新すると、テンプレートに基づいて自動的に検索対象文字列が保存されます。

:::caution
反映まで数分程度時間がかかる場合があります。
:::


## 動作の確認をする
コンテンツを追加して、Swagger UIから検索結果を確認します。

### コンテンツを追加する
[コンテンツ定義の作成]で作成したコンテンツ定義に従って、コンテンツを追加します。

フォームに内容を入力し、[追加する] ボタンをクリックしてコンテンツを追加します。
コンテンツを追加・更新すると、テンプレートに基づいて自動的に検索対象文字列が保存されます。

:::caution
反映まで数分程度時間がかかる場合があります。
:::

![Image from Gyazo](https://t.gyazo.com/teams/diverta/e4a9bf45e89e0d36dbda35e7b31f8207.jpg)

### 検索対象文字列を確認する
追加されたコンテンツの編集画面で、[その他] ボタンをクリックして選択肢が表示します。
[キーワードテンプレート]をクリックすると、出力された検索対象文字列を確認することが出来ます。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/7c63e594bd37e6eab61e8a28907a69a2.png)

:::caution
反映完了まで[キーワードテンプレート]の選択肢が表示されません。
:::

今回の例では、表示された文字列は以下のようになります。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/9956ca779839ec1fb3d46aa1d6ff1662.png)

:::tip
検索対象文字列にHTMLタグを含む場合、HTMLタグ自体も検索対象となります。
HTMLタグを除いて検索したい場合はstrip_tags修飾子の利用を検討ください。
- [KurocoのSmartyで利用可能なPHP関数](/ja/docs/reference/smarty-php-function/)
:::

:::info
- 生成できる検索対象文字列はコンテンツ毎に100MB(3byte想定のマルチバイト文字で3000万文字以上)までとなり、100MBを超える文字列はカットされます。
- テンプレートで生成する検索対象文字列内の半角英字は自動的に小文字になります。
:::

### 全文検索用エンドポイントを用意する
検索用のエンドポイントを用意します。

[エンドポイントの設定方法](/ja/docs/tutorials/configure-endpoint/)を参考に、エンドポイントを作成します。  

今回はパス・モデルを以下のように設定します。
- パス： search
- カテゴリー: コンテンツ
- モデル：Topics, v1
- オペレーション：list
- topics_group_id：58 ([コンテンツ定義の作成](#コンテンツ定義の作成)で採番されたID)

![Image from Gyazo](https://t.gyazo.com/teams/diverta/9f969c8cb1375fb406f951ef26b045b9.png)

### Swagger UIで確認する
Swagger UI画面から[全文検索用エンドポイントを用意する]で追加したエンドポイントにリクエストします。
full_text_searchにキーワードを入力することで、全文検索文字列にキーワードを含むコンテンツのみが返却されます。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/545d3da14aa62b84ccc1ad83ae0f3a90.png)

:::tip
複数のキーワードをスペース区切りで指定した場合のAND/OR条件は`full_text_search_cond`パラメータで設定可能です。  
指定が無い場合はANDで動作します。
:::

## 関連ドキュメント
- [コンテンツ定義を作成する](/ja/docs/tutorials/adding-a-topics/)
- [拡張項目設定](/ja/docs/management/extra-information/)
- [メンバー詳細設定で利用できる拡張項目一覧](/ja/docs/reference/list-of-extra-column-available-on-member-field-settings/)
- [エンドポイントの設定方法](/ja/docs/tutorials/configure-endpoint/)