セクションおよびインデックス設定

Prev Next

Classic/VPC環境で利用できます。

ドメインのセクションとインデックスは検索する文書のタイプと検索目的に合わせて定義します。提供する検索方法に合わせたインデックスを作成するとより早くレスポンスを受けます。
例) 検索対象文書が商品名、価格、商品説明、おすすめ数、タグで構成された場合

  • セクション文書の構成項目と同様に定義(商品名、価格、商品説明、おすすめ数、タグ)
  • インデックス: 検索目的に合わせてセクションを選択して構成
    • 商品名だけで検索する場合: 商品名に相当するセクションのみ選択
    • 商品名、価格など、複数の項目で検索する場合: 検索する項目に相当する複数のセクションを選択

セクションおよびインデックス設定ではドメインにセクションを追加する方法とインデックスを追加および修正する方法を説明します。またインデックスの設定項目と Listタイプのデータをインデックスする方法について説明します。

セクションを追加

ドメインにセクションを追加する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールで、 Menu > Services > Big Data & Analytics > Cloud Searchメニューを順にクリックします。
  2. Domainメニューをクリックします。
  3. ドメインリストからセクションを追加するドメインを選択し、[インデックス設定] ボタンをクリックします。
  4. [セクション] タブをクリックします。
  5. セクション名およびランキング変数(データタイプ)を入力し、[追加] ボタンをクリックします。
    • セクションを保存した後はセクションの修正や削除ができません。
    • セクション名は英文字、数字、アンダースコア(_)のみ入力できます。
    • セクションはドメインにアップロードする検索対象文書のスキーマと同様に構成します。
    • i-cloudsearch-delete: 追加したセクションを削除
  6. セクション追加が終わった場合は、[保存] ボタンをクリックします。
参考
  • セクションおよびインデックスの変更後、自動補完インデックスは手動で更新します(自動補完インデックスの更新を参照)。
  • ランキング変数はデータ型ではなく、セクションのプロパティを表す変数です。
    • 文書を検索する時にランキング変数(セクションプロパティ)を利用し、ソート(sort)、アグリゲート(aggregate)、スコープ(scope、user_scope)できます。
    • 当該セクションのプロパティでソート、アグリゲート、スコープをしない場合、ランキング変数は追加しません。
    • 不要なランキング変数を追加すると文書のアップロードおよびインデックスの修正時に不要なスペースを追加で使用するか時間がかなりかかります。

インデックスの変更

既存ドメインのインデックスを追加および修正する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールで、 Menu > Services > Big Data & Analytics > Cloud Searchメニューを順にクリックします。
  2. Domainメニューをクリックします。
  3. ドメインリストからセクションを変更するドメインを選択し、[インデックス設定] ボタンをクリックします。
  4. [インデックス] タブをクリックします。
  5. [追加] ボタンまたは [修正] ボタンをクリックし、表示されるポップアップでインデックスを追加または修正し、[保存] ボタンをクリックします。
    • インデックス設定項目
      • インデックス名: 英文字、数字、アンダースコア(_)のみ入力可能
      • ターム位置の有効化: インデックスされたタームの位置情報を記録するかを選択(ターム位置の有効化を参照)
      • 文書加重値関数: ビルドごとに計算されたセクション加重値を集計する関数(文書加重値関数を参照)
        • Sum: 関数 sum_wgtを選択(加重値の合計を計算)
        • Max: 関数 max_wgtを選択(加重値の最大値を計算)
      • ビルド情報
        • 名前: ビルド名を入力
        • セクション加重値: ランキング点数を計算する時に適用する当該セクションに対する加重値を入力(セクション加重値を参照)
        • 作成対象(セクション): 当該ビルドを適用するセクションを複数選択
        • 解析オプション: 文書のインデックスに利用する解析機およびシノニム辞書を選択(解析オプションを参照)
    • インデックスを保存した後はインデックスを削除できません。
    • [削除] ボタン: 追加したインデックスを選択し、クリックしてインデックスを削除
      • 既存インデックスは削除できません。
  6. セクション追加および修正が終わった場合は、[保存] ボタンをクリックします。
参考

セクションおよびインデックスの変更後、自動補完インデックスは手動で更新します(自動補完インデックスの更新を参照)。

インデックス設定項目

検索目的に合わせてインデックスを設定します。言語解析ツールを含む様々な解析ツールを活用して詳細なインデックスができ、複数のビルドを追加してセクションごとにセクション加重値とインデックスオプションを別々に指定できます。

ターム位置の有効化

ターム位置の有効化オプションを適用するとインデックスされたタームの位置情報を保存します。

注意

ターム位置の有効化オプションを適用した場合、インデックスを修正すると作成した解析ツールの総数を変更できません(buildInfosの配列サイズが同じである必要があります)。

タームの位置情報を保存するとインデックスされたタームの位置を指定して一致検索できます。

  • 一致検索: 複数のインデックスキーワードの位置と距離が検索キーワードと一致する文書を検索

例) ターム位置の有効化オプションを適用したインデックス

{
  "indexes": [
    {
      "name": "atomic_idx",
      "createTermLoc": true,
      "documentTermWeight": "sum_wgt",
      "buildInfos": [
        {
          "name": "index_build",
          "sectionTermWeight": "1 * stw_2p(tf, 0.5, 0.25, 0., length / 128.0)",
          "indexProcessors": [
            {
              "type": "atomic",
              "method": "atomic",
              "option": ""
            }
          ],
          "sections": [
            "description"
          ]
        }
      ]
    }
  ]
}

例) 一致する検索クエリ

{
    "search": {
        "atomic_idx": {
            "main": {
                Query: 「現代自動車はどこで作りますか」、
                "term_distance": 1,
                "option": "within"
            }
        }
    }
}

文書加重値関数

文書加重値関数は検索結果の文書加重値(qds、クエリ文書との類似度)計算に使います。文書加重値関数を通じてセクション加重値を利用して文書加重値を計算し、別途の設定がない場合は文書加重値が高い順に検索結果を並べます。文書加重値関数として次のうち1つを選択します。

  • Sum: 関数 sum_wgtを選択(加重値の合計を計算)
  • Max: 関数 max_wgtを選択(加重値の最大値を計算)
参考

検索時にランキング数式を通じて文書加重値に再度加重値を与えてランキング点数(_relevance)を計算します(ランキング数式を参照)。
例) クエリ(q1、q2)別の qdsに加重値を与えてランキング点数を計算

_relevance = qry_qds("q1") * 0.7 + qry_qds("q2") * 0.3

セクション加重値

セクション加重値は当該セクション情報の重要度を表す値です。セクション加重値の基本式と各関数および変数に関する説明は、次の通りです。

imp*stw_2p(tf, A, B, C, dlen)
  • stw_2p: 検索システムモデル(2ポアソンモデル)関数
  • tf: 検索クエリが当該セクションに登場した回数(term frequency)
    • min(tf, n)と入力すると過剰に繰り返された単語の登場回数を nに制限します。
  • A: 0~1までの値で指定し、1に近いほどセクション内容が長い場合に受けるペナルティが増加
  • B: 0以上の値で指定し、大きいほど tfが低い文書と tfが高い文書の点数差が増加
  • C: 0~1までの値で指定し、1に近いほど文書間のセクション加重値の差が減少
    • Cが0.0の場合、セクション加重値が0~1点になります。
    • Cが0.5の場合、セクション加重値が0.5~1点になります。
    • Cが1.0の場合、全ての文書のセクション加重値が同じく1点になります。
  • dlen: 文書の長さ
  • imp: セクションの重要度
参考

セクション加重値の基本値1.0 * stw_2p(tf, 0.5, 0.25, 0., length / 128.0)はショッピングモール検索を基準に設定した値です。

  • 商品名は128字を超えないと仮定し、Aの値の影響を小さく設定
  • Bの値を小さく設定し、クエリがセクションに登場した回数に対する影響を小さく設定
    • 解析ツールでインデックスされた単語を1つでも含んだ場合は順位が上がり、2つ以上でも順位は大きく変わりません。
    • 一般的な投稿記事検索(件名+内容)の場合、Bの値で2.0を使用します。
  • dlenの値を、文書の長さを128.0に割った値(length/128.0)に設定し、Aの値によるペナルティの基準を128字に設定

解析オプション

解析オプションでインデックス方法による解析ツールとシノニム辞書を選択します。Cloud Searchは hanatermという形態素解析ツールを提供し、インデックス方法は atomicと sgmtを提供します。

参考
  • 解析オプションでシノニム辞書を選択するには、先にシノニム辞書を作成します(シノニム辞書の作成方法はシノニム辞書の作成を参照)。
  • atomicのインデックス方法は APIを介してのみ設定できます(APIを介したインデックスの設定方法は Cloud Search APIガイドを参照)。

インデックス方法別に選択できる解析オプションは次の通りです。

  • atomic
    • オプションを設定しない: 空白で区分された文字列をインデックス
    • Oneterm: 全体の入力文字列を一つにインデックス
  • sgmt
    • 言語オプション: 言語を選択するとその言語に適切な解析オプションを一緒に適用
      • 韓国語: korean(+korea +josacat +eomicat)
      • 英語: english(+english +revert)
      • 日本語: japanese(+japan +josacat +eomicat)
      • 中国語(簡体字): chinese(+china_cn)
      • 中国語(繁体字): taiwanese(+china_tw)
      • タイ語: thai(+thai)
      • インドネシア語: indonesian(+indonesian)
    • 形態素の解析オプション(韓国語)
      • 助詞: +josacat
      • 語尾: +eomicat
      • 派生名詞の語根: +nounstem
      • 複合名詞: +compsub
      • 3文字の合成名詞: +compnoun3
    • 韓国語以外の言語共通オプション
      • 用言の原型: +revert
    • 共通オプション
      • 全体文節のインデックス: +word
      • 文字タイプ別に分割: +token-all
      • マージされたトークン分割(+token-allとは一緒に使用不可): +alphanum

インデックス例

ここではショッピングモールの商品を検索する場合を仮定し、インデックスの検索結果の例を説明します。ショッピングモールの商品情報を次の表のように仮定します。

category brand item description
TV LG 55インチ TV 説明
TV LG 65インチ 説明
TV Samsung 65インチ 説明
TV Samsung 75NTAWE3 説明
TV周辺機器 NAVER LG TV台 説明
TV周辺機器 NAVER スタンド 説明

この場合、次のようにインデックスを作成します。

  • 解析オプションにシノニム辞書の syno_dicを追加した例です。
{
  "indexes": [
    {
      "name": "shopping",
      "createTermLoc": true,
      "documentTermWeight": "sum_wgt",
      "buildInfos": [
        {
          "name": "exact_oneterm",
          "sectionTermWeight": "0.5 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
          "indexProcessors": [
            {
              "type": "hanaterm",
              "method": "atomic",
              "option": "oneterm"
            },
            {
              "type": "add-normalized-synonym",
              "dictName": "syno_dic",
              "maxSynoNum": -1
            }
          ],
          "sections": [
            "category"
          ]
        },
        {
          "name": "category_sgmt",
          "sectionTermWeight": "0.10 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
          "indexProcessors": [
            {
              "type": "hanaterm",
              "method": "sgmt",
              "option": "+korea +josacat +eomicat +syno=syno_dic"
            },
            {
              "type": "add-normalized-synonym",
              "dictName": "syno_dic",
              "maxSynoNum": -1
            }
          ],
          "sections": [
            "category"
          ]
        },
        {
          "name": "brand_item_atomic",
          "sectionTermWeight": "0.05 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
          "indexProcessors": [
            {
              "type": "hanaterm",
              "method": "atomic",
              "option": ""
            },
            {
              "type": "add-normalized-synonym",
              "dictName": "syno_dic",
              "maxSynoNum": -1
            }
          ],
          "sections": [
            "brand",
            "item"
          ]
        },
        {
          "name": "brand_item_name_sgmt",
          "sectionTermWeight": "0.05 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
          "indexProcessors": [
            {
              "type": "hanaterm",
              "method": "sgmt",
              "option": "+english +revert +korea +josacat +eomicat +syno=syno_dic"
            },
            {
              "type": "add-normalized-synonym",
              "dictName": "syno_dic",
              "maxSynoNum": -1
            }
          ],
          "sections": [
            "brand",
            "item"
          ]
        },
        {
          "name": "description_sgmt",
          "sectionTermWeight": "0.03 * stw_2p(tf, 0.5, 0.25, 0., length / 128.0)",
          "indexProcessors": [
            {
              "type": "hanaterm",
              "method": "sgmt",
              "option": "+english +revert +korea +josacat +eomicat +syno=syno_dic"
            },
            {
              "type": "add-normalized-synonym",
              "dictName": "syno_dic",
              "maxSynoNum": -1
            }
          ],
          "sections": [
            "description"
          ]
        }
      ]
    }
  ]
}

検索キーワードの「LG TV」を検索すると、検索は次のように処理します。

  • categoryが TVの文書は検索キーワードと atomicで一致し、加重値を最も多く与えます。
  • LGの55インチ TVは brandと itemで検索キーワードと一致するため加重値を多く与えます。
  • LGの65インチは検索キーワードと categoryが一致するものの、brand_item_atomicビルドによって順位が低くなります。
  • TV台は検索キーワードが categoryと一致しないため、順位が低くなります。

Listタイプのデータインデックス

Cloud Searchが提供する検索エンジンは JSONの Listタイプをサポートしません。しかし次のように解析オプションを設定すると、Listタイプのデータを迂回して使用します。

参考

コンソールではサポートしておらず、APIを介してのみ設定できます(APIを介したインデックスの設定方法は Cloud Search APIガイドを参照)。

例) tagというセクションに対する解析オプションを指定

{
"indexProcessors": [
    {
        "distance": 1000,
        "delimiter": "\u001f",
        "type": "tokenize"
    },
    {
        "type": "hanaterm",
        "method": "atomic",
        "option": "+atomic"
    }
  ]
}
  • 解析オプションを通じて JSON Listタイプで入力した資料を検索エンジンが使用できるよう、区切り文字(delimiter)を入れて保存します。
    • tagセクションに[「情報」、「検索」]という情報を入力すると、解析オプションを通じて「情報\u001f検索」に返還した後にインデックスされ、「情報」、「検索」にトークン分割されて検索に使用できます。
  • トークン分割されたタグは他のタグの間にあるタグが検索されないよう、ターム間の距離(例) 1000)を仮で指定します。ターム間の距離をオプションとして指定して within検索をすると、トークン分割されたタグの間にあるタグを含まずに検索できます(within検索に関する詳細は searchを参照)