RestController...Javaでは複雑な情報を扱う場合はクラスを定義し、そのインスタン...
Transcript of RestController...Javaでは複雑な情報を扱う場合はクラスを定義し、そのインスタン...
-
RESTのために用意されている専用コントローラー
RestController
分散システムのためのアーキテクチャースタイルネットワーク経由で
外部のサーバーへアクセスし、必要な情報を取得する仕組み
クライアントからWebサービスにアクセスし、必要な情報を取得する
基本的なアーキテクチャースタイル
多くはシンプルなテキスト形式の形でデータを送信する
このRESTを使用して設計されるシステムをRESTfulと呼ぶ
REST
こうしたRESTfulなWebサービスを構築する際に利用するコントローラー
が、RestControllerである。
RestControllerは、Webアプリケーションの一般的なページ(HTMLのソー
スコードを返信するページ)に比べるとシンプル。
大抵はHTMLを使わず、ただのテキストとして情報を送信するだけなの
で、HTMLベースのWebページより利用しやすい。
RestController
Springの基本 - 1 ページ
-
RestControllerSampleクラスには、indexというメソッドが1つだけあり、
@RequestMappingというリクエストマッピングのためのアノテーション
がある
@Requestmapping(アドレス)
サーバーが受け付けるURLと処理を関連付けする(マッピング)するた
めの仕組み
用意されるメソッド毎に「これは〜というアドレス用」と関連付けを
用意する
サーバーアクセス時に、そのアドレスに割り当てられているメソッド
が自動的に呼び出され、実行されるようにする
リクエストマッピング
このリクエストマッピングの設定を行うのが、@Requestmappingアノ
テーションである。
この引数に指定したアドレスにアクセスがあると、アノテーションが付け
られているメソッドが自動的に実行される。
例として、@Requestmapping(" / ")と引数が指定すると" / "アドレスにア
クセス時に、indexメソッドが実行される。
リクエスト用のメソッドについて
RestControllerでリクエストにマッピングされるメソッドは、書式が決
まっている。
public String メソッド名( ){
------処理-----
return テキスト;
}
戻り値はStringを指定し、引数は不要(引数有も可能)。戻り値として
returnされるテキストが、クライアント側に送信されるテキストになる。
メソッド内でテキストを作成し、それをreturnすれば、RESTfulなシステ
ムを構築できる。
RequestMapping
Springの基本 - 2 ページ
-
“/”では複数のプロジェクトを識別できないので、コンテキストパスの設
定を行う
src/main/resources/application.propertysを編集し、springを再起動す
る
server.servlet.context-path=/任意のパス
サーバー起動後に”http://localhost:8080/任意のパス/“ へブラウザで
アクセスできれば正しく設定ができている
STSでプロジェクトを作成した場合、自動設定されないので、新規プ
ロジェクト作成時に、コンテキストパスの設定も忘れずに行う
コンテキストパスの追加
Springの基本 - 3 ページ
-
パラメータ渡しを行うには、URLのパス部分に渡された値を変数とし
て取り出す機能を利用する
@RequestMapping(“/{value}”)
{value}の部分が、パス変数の指定であり、” / ”アドレスの後のパスの
値をvalueと名付けた変数として受け取ることを示す
Indexメソッドは次のようになる
public String index(@PathVariable int value)
この引数が、パス変数で値を渡されることを明示的に示す。
/{value}で指定されたvalueが、引数のvalueに渡される
@PathVariable
http://localhost:8080/任意のパス/100
上記アドレスにアクセス時、/100というパスの100が{value}のパス変
数の値に代入される
その後、この値がindexメソッドの引数valueに渡される
パス変数を扱う場合はデータ型に注意する
パラメータ渡し
Springの基本 - 4 ページ
http://localhost:8080/sbootparamsample/200
-
RESTのサービスは、テキストを出力するだけであるが、それだけの
機能を持ったサービスを提供することは通常ない
出力される内容はより複雑なものであることが多い
Javaでは複雑な情報を扱う場合はクラスを定義し、そのインスタン
スで処理を行うのが一般的
RestControllerも、考え方は同じである
RestControllerクラスは、戻り値がStringであったが、クラスを指定
することも可能
returnされたインスタンスの内容をJSON形式に変換したテキストが
出力されるようになる
主にJavaScriptのオブジェクトをテキストとしてやり取りする
際のフォーマットとして使用
RestControllerは、JavaのインスタンスをJSON形式へ変換して
出力する
SpringBoot側で自動的に行うので、インスタンスをJSON形式
に変換するコードを記述する必要はない
インスタンスをreturnするだけでよい
JSON
オブジェクトのJSON出力
Springの基本 - 5 ページ
-
RestControllerクラスは、RESTのサービス作成に有用であるが、
実際のWebアプリケーションでは、HTMLのWebページの方が利用頻
度が高いので、RestControllerクラスの代わりにControllerクラスを使
用する
@Controllerをクラスにつける
通常のWebページを利用する際に、コントローラークラスに
@Controllerを記述する
Controllerクラスの場合、予め表示するページをテンプレートとして
用意し、それを読み込み表示内容を作成する
テンプレートを利用する際はライブラリも用意する必要がある
テンプレートを使用し、HTMLと値をやり取りするには、
@Controllerを使用する
@RestControllerと違い、必ず表示用の画面が必要になるので注意
controllerによるwebページ作成-1
Springの基本 - 6 ページ
-
public String index(Model model)
indexメソッドには引数を指定可能
ModelクラスはWebページで利用するデータを管理するためのクラス
Modelクラスに、テンプレートで利用する値を設定するとデータを渡
すことが可能
model.addAttribute(“msg”, “メッセージ内容”);
addAttributeメソッドで値を設定
第1引数には値の名前を、第2引数には保管する値を設定
第2引数には、オブジェクトを渡すことも可能
例では、msgという名前で、メッセージ内容を値としてテンプレート
側へ渡している
xmlns宣言について
index.html
最初にThymeleafを使う宣言をする
foobar
上記のような形でタグに属性を埋め込む
このとき使うth:hogeという属性の宣言が必須
上記のxmlns宣言により、以降th:hogeという属性が使用可能になる
controllerによるwebページ作成-2
Springの基本 - 7 ページ
-
th:text属性について
hoge
th:text属性はThymeleaf独自の属性
Thymeleafによりページのレンダリング時に、th:hogeの値がタグの
値に置き換えられてレンダリングされる
独自属性のため、レンダリングされなければ、表示には全く影響を与
えない
index.htmlが直接表示された場合でも、
タグの内容が表示される
だけになる。Thymeleaf用に記述した情報が表示に悪影響を及ぼすこ
とはない
このth:textには、${msg}という値が設定されている
これは予め用意されたmsgをここに埋め込むことを示す
コントローラー側で用意した値をここに使用
埋め込む値は、Thymeleafの属性の値として用意することに注意
${msg}
上記の場合は、実行時に${msg}という文字列が表示される
${msg}はThymeleaf用の値とは認識されないので、コントロー
ラーで用意した値に変換されない
必ず、th:〇〇という属性の値に埋め込む必要がある
${値の名前}
controllerによるwebページ作成-3
Springの基本 - 8 ページ
-
indexの引数にModelクラスを指定する以外にもModelAndViewク
ラスを指定することも可能
@RequestMapping("/")
mav.addObject("msg", "メッセージ内容");
mav.setViewName("index");
return mav;
public ModelAndView index(ModelAndView mav){
}
Modelクラスの場合は、テンプレートに渡す値の設定のみを扱
い、戻り値でView名を返却するが、ModelAndViewクラスの場合
は、値の設定とView名をまとめて設定することが可能
戻り値にはView名設定済みのModelAndViewクラスを返却する
Modelクラスとはメソッド名が変わるので注意
mav.addObject("msg", "メッセージ内容");
第1引数には値の名前を、第2引数には保管する値を設定
第2引数には、オブジェクトを渡すことも可能
mav.setViewName("index");
View名を設定します。
Modexlクラス、ModelAndViewクラスどちらを使用しても結果は
変わりませんので、使いやすい方を使って問題ありません。
ModelAndView
Springの基本 - 9 ページ
-
RequestMappingに属性追加
@RequestMapping(value="/", method=RequestMethod.GET)
@RequestMappingの引数を、value=”/”と記述するのは必須
valueしか値がない場合は、省略して値だけの記述可能
引数が複数ある場合は、引数名を指定して書く必要がある
value=”/”にマッピングするメソッドはGETとPOSTの2つがある
どちらも同じアドレスのため、メソッドを指定してGET用、POST用と
区別する必要がある
フォームから送信された値は、sendメソッドで処理する
@RequestParam(value="hoge", required=false)boolean hoge
フォーム送信された値を指定するためのアノテーション
フォームにあるname=”hoge” で選択された値が、この引数hogeへ
渡される
@RequestParam
Formの送信-1
Springの基本 - 10 ページ
-
フォームコントロール
checkbox 選択状態をbooleanで取得可能
radiobutton 選択した項目のvalueをStringで取得可能。未選択はnull
select 単一項目の場合はStringで取得可能
複数項目が選択できる場合は、選択された各項目を1つにまとめたString配列
で取得可能。未選択はnull
index.html
@{/}で、コンテキストパスを含めた送信先を指定
action=”/”ではコンテキストパスが含まれないので
http://localhost:8080/へアクセスするためエラーになる
コンテキストパスを指定している場合には必ず記載する
th:action
Formの送信-2
Springの基本 - 11 ページ
-
Spring Bootでは、画面の表示はテンプレートを使用する
代表的なものには次の通り
th:hogeなどの属性をHTMLタグに追加し、各種の値や処理などを組
み込むことが可能。
Spring Bootでは、Thymeleafを選択する人が一番多い
Thymeleaf (タイムリーフ)
Spring Bootでアプリケーションは組み込み用のJavaサーバーととも
にJARファイルにまとめて実行する形でデプロイされた場合にはJSP
が動かない
Javaサーバーが動作しておりWARファイルをアップロードした場合
は動作する
JSP
クラウドを利用してデプロイした際はJARファイルを選択するた
め、JSPを使用できない機会が増える
${hoge}と値を埋め込むテンプレート
Thymeleafが特殊な属性で値を設定するのに対し、FreeMarkerはテ
キストを表示する場所に直接${}を埋め込んで表示可能
FreeMarker
制御のための機能にはHTMLのタグと同様のなどのタグを
使うため、HTMLのビジュアルエディターなどでHTMLの構造に悪
影響を与える可能性がある
Thymeleaf-1
Springの基本 - 12 ページ
-
GroovyはHTMLとは異なるコード体系のため、HTMLのタグ
とは異なる
Groovy
$や#などの特殊記号を使い変数等をHTMLコード内に直接記
述可能Velocityは直接書き込めるため、ビジュアルエディター
などへの影響は少ない
Velocity
幅広い言語に対応するテンプレートエンジン
Java、PHP、Ruby、Python、JavaScriptなどを使用可能
{{}}記号を使い、変数等をHTMLコード内に埋め込む
Mustache
Thymeleafの基本は、値を出力することである
これは、${{hoge}}という形で記述される。
${{}}を変数式と呼ぶ
変数式の中に記述するのは、OGNL
Javaの値にアクセスするための式言語
Thymeleafに限らず、各種のライブラリやフレームワークな
どで使われる。
Javaに似た書き方であり、基本的にJavaで式を書けば、シン
プルなものなら大抵はOGNLの式になると考えて良い
OGNL
Thymeleaf-2
Springの基本 - 13 ページ
-
th:text="${new java.util.Date().toString()}">
変数式には、単に変数や値などを書くだけでなく、インスタンスを
生成、メソッド呼び出し等のOGNL式の記述可能
変数式は、変数を記述してそのまま出力可能
この変数は、コントローラーで値を用意しておき、それをテンプ
レート側に出力するのが基本
Javaのクラスでは、テンプレートでよく利用されるクラスがある
Thymeleafでは、よく使われるクラスを#nameという定数として変
数式の中に直接記述して利用可能
これをユーティリティオブジェクトと呼び、次に一例を示す
#strings Stringクラスの定数
#numbers Numberクラスの定数
#bools Booleanクラスの定数
#dates Dateクラスの定数
#objects Objectクラスの定数
#arrays Arrayクラスの定数
#lists Listクラスの定数
#sets Setクラスの定数
#maps Mapクラスの定数
これらはクラス定数なので直接クラスメソッドなどを呼び出し可能
ただし、new #datesなどのようにDateインスタンスを生成するよう
な記述の仕方は不可
#dates.hogeといったクラスフィールドやクラスメソッドの呼び出
しに利用する
Thymeleaf-3
Springの基本 - 14 ページ
-
Webアプリケーションでは、クエリ文字列にパラメータをつけて送信
することができる
その場合、コントローラーを通さず、直接テンプレート内でパラメー
タを利用することも可能である
このような場合にはparam変数を利用する
変数式の中で直接利用できる変数
この変数の中から、パラメータ名を指定して値を取り出す
${param.id}でid=hogeの値を取得可能
通常は値は配列になっているので、ここから更に値を取り出す
param内のidやnameの配列の最初の要素を指定することで、値の
取り出しが可能
param
テキストリテラルの記述
th:text="'from parameter... id=' + ${param.id[0] + ',name=' +
param.name[0]}"
th:textの値では””の中に、’’で値が記述されており、これはOGNLでテ
キストリテラルを記述する際の書式である
1つのテキストを表示する場合は、””内に直接テキストを記述するが、
複数リテラル利用時には、””内に’’でテキストリテラルの記述可能
パラメータへのアクセス-1
Springの基本 - 15 ページ
-
Thymeleafには、リンク指定に専用の式が存在する
URLを指定する属性 (タグのhrefなど)で利用
@{/hoge}と記述すれば、/hogeへのリンクを指定可能
@{アドレス}
変数式は、基本的にコントローラー側に用意した値をそのまま出力
するだけのものであるが、オブジェクトを使用する場合は扱いが難
しくなる
${object.name}のようにオブジェクトのプロパティやメソッドを指
定可能であるが、オブジェクト内に多数の値がある場合や、おぶ
じぇくとがリネームされた際にすべての名前をリネームするには時
間がかかるので、オブジェクトを指定し、選択されたオブジェクト
内の値を取り出すための変数式を使用する。以下に書式を示す
オブジェクトを扱う変数式の内部で利用
*{}
th:object属性でオブジェクトを設定することで、タグの内部で、*{}
による変数式を使用可能
この変数式では、オブジェクト内のプロパティなどを名前だけで指
定可能
パラメータへのアクセス-2
Springの基本 - 16 ページ
-
変数式の中に複数の値を組み合わせてテキストを出力する場
合、” ‘A ‘ + ‘ B’ ”のように””内にテキストリテラルを連結して記
述可能だが、それ以外にもリテラル置換が利用できる
以下のように記述する
“| something else |”
テキストの前後に|記号を記述する
||で囲まれた中には変数式を直接書き込み可能
リテラル置換
Springの基本 - 17 ページ
-
Thymeleafは変数式でテキストを出力する際、安全のために
HTMLタグをすべてエスケープ処理するため、th:textはHTMLの
タグもそのままテキストとして表示されてしまう
この場合は、th:utextを使用する
アンエスケープテキストをそのまま出力するための属性
設定されたテキストをそのままの状態で出力可能
値にHTMLタグが含まれていると、それがそのまま機能して
しまい、出力される値の内容に問題があればトラブルの原因
になる可能性もある
一例として、ユーザーから送信された情報を元にテキストを
作成する場合、XSS などの攻撃に対して無力になる
このような危険性を踏まえたうえで使用する
th:utext
HTML出力
Springの基本 - 18 ページ
-
変数式の値が真のとき値1を表示、偽なら値2を表示
Javaの三項演算子と同じ動き
変数式 ? 値1:値2
2つの値の切り替えだけでなく、表示そのものをON/OFFする
ことも可能。次の制御用の属性を使用する
th:if
値として設定したものがtrueのとき、このタグ及びその内部に
あるタグを表示する
th:if=”条件”
値として設定したものがfalseの場合に、このタグ及びその内部
にあるタグを表示する
th:unless=”条件”
これらの属性は、true/false判定をする際に有効なものが真偽値だ
けでなく、次のような値を判定する
true
・true値
・ゼロ以外の数値
・”0”、”off”、“no”といった値以外のテキスト
false
・false値
・数値のゼロ
・”0”、”off”、“no”といったテキスト
条件式-1
Springの基本 - 19 ページ
-
th:ifなどは真偽値を使った条件分岐以外に、3つ以上に分岐さ
せたい場合に使用する
次のように記述します。
・・・
・・・
th:switch
th:switchは条件式の値をチェックし、その内側にあるth:caseから同
じ値のものを探してそのタグだけを出力する
条件式-2
Springの基本 - 20 ページ
-
JDBCのAPIを直接使用した従来の開発方法ではデータベースを扱う場合、
通常は以下のような煩雑な作業が発生し、バグを埋め込んでしまう可能性
があった
• 接続に関する情報を設定ファイルなどから読み込みコネク
ションを確立
• 接続時のコスト軽減でコネクションをプーリング
接続処理
• 検索条件を指定してSELECT文を組み立て
• ResultSetからデータを取り出し、オブジェクトにデータを
セットし直す 結果件数分繰り返し、配列等に格納し呼び出し
元に返す
検索系処理
• オブジェクトの各プロパティからデータを取りし、VALUES
句やSET句に取り出したデータを指定
更新系処理
また、SQL文などを直接ソースコードに埋め込むことが多く、テーブル構
造の変更などがあると、アプリケーション内のソースコードを修正しなけ
ればならない
そのため、SQL文が複数のソースコードに記述されていると修正漏れや修
正間違いなどを常に意識しなければならない
これら問題を解決するのが、O/Rマッピングである
ORマッピング-1
Springの基本 - 21 ページ
-
オブジェクトとRDBをマッピングすること
O/Rマッピングは実装時のデータベース操作にかかわる煩雑な作
業を軽減し、インピーダンスミスマッチを解決する
O/Rマッピング
Javaのようなオブジェクト指向の言語でRDBを利用すると、オ
ブジェクトとRDBのマッピングに時間を多く消費する
これは両者の設計思想の違いから生じており、この問題をイン
ピーダンスミスマッチと呼ぶ
インピーダンスミスマッチ
Javaは、プログラムをオブジェクトとして設計し、現実世界のモデ
ルに即したものとしてデータモデルを定義するが、
データベースは、正規化により、データの検索/登録/更新処理に
最適なモデルを定義する
データベース設計では、現実世界のモデルの構造は無関係であり、
正規化に基づいてモデルが考えられている
インピーダンスミスマッチを解決するために、表形式のデータをオ
ブジェクト形式のデータに対応付けるマッピングコードを作成する
必要がある
これはデータ構造が複雑であると作業量が膨大になり、単調な繰り
返しが多く、バグを埋め込む危険性が高くなる
ORマッピング-2
Springの基本 - 22 ページ
-
O/Rマッピングは、オブジェクトとRDBを対応付けし、オブジェクトと
データベース間の橋渡しを行う
O/Rマッピングの機能は基本的には次の機能を提供する
データベースとの接続やコネクションプーリングの管理
コネクション管理機能
外部ファイルにオブジェクトの属性名とテーブルの列名に関す
るマッピング定義を設定すると自動的にマッピング処理を行う
自動マッピング機能
自動生成ツールによりマッピングファイル、DTO、DAOなど
のファイルの自動生成
自動生成機能
JDBCドライバやデータベースの接続情報を、O/Rマッピング
ツール側で管理
接続情報の管理機能
一度取得した検索結果をメモリ上に記憶し、同じ検索処理が行
われた場合は、メモリ上にある検索結果を返す
データベースへのアクセスを減らし、パフォーマンスの向上
キャッシュ機能
ORマッピング-3
Springの基本 - 23 ページ
-
O/Rマッピングの処理の流れは以下の通り
1. データベースの接続情報をXMLファイルに定義(データベース設定
ファイル)
2. クラスのフィールドとテーブルカラムの対応付けをXMLファイルに
定義(マッピング・ファイル)
3. O/Rマッピングツールがデータベース設定ファイルとマッピングファ
イルを読み込み自動的にマッピング処理を行う
4. アプリケーションからO/RマッピングツールのAPIを介してデータ
ベースへアクセス
O/Rマッピングのメリット
ソースコードからデータベースにアクセスする処理の部分を切
り離すので、変更に柔軟に対応可能
変更に強い
オブジェクトとRDBとの構造的な違いを意識せずに開発可能
インピーダンスミスマッチの解決
自動生成機能でソースファイルなどを作成しなくてもよい
開発効率の向上
データベースの差(SQLの記述の違い)を吸収
データベースの差を吸収
ORマッピング-4
Springの基本 - 24 ページ
-
O/Rマッピングツールにより記述の仕方が異なる
一例として、SQL文を明示的に記述する必要があるものや、SQL文
を記述する必要がないものもある
SQL文を明示的に記述するものは、マッピングファイルなどにSQL
文を直接記述する
自身でSQL文を記述できるので、SQLの機能を十分に引き出すこと
ができ、SQL文を記述しないタイプと比較して柔軟な対応が可能
このタイプのO/RマッピングツールにはMyBatisがある
MyBatisには、SQLを記述せずにJavaで条件式を作成する機能もあ
る
SQLを記述しないものは、永続化オブジェクトの属性を変更するだ
けでレコードのカラム値が変更される
このとき、O/Rマッピングツール自身がSQL文を自動的に生成して
実行する
永続化オブジェクトを操作することでSQLが自動実行されるで、
SQLを意識しないでデータベースを操作することが可能
このタイプのO/RマッピングツールにはTorqueやHibernateなどが
ある
ORマッピングツールの種類
Springの基本 - 25 ページ
-
このアノテーションをつけたクラスを設定クラスに指定し、Spring起動時に
読み込まれる
@Configuration
MyBatisの設定ファイルの配置場所を@MapperScanで指定する。Mybatisを
使用する際は必ず記述
@MapperScan(basePackages="hoge")
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource ds) throws Exception {
上記によりDB接続のセッション情報やコネクション情報を作成
@BeanはSpring起動時に自動的にインスタンス化をする仕組み
Springを使用する際はnewでインスタンス化をせず、@Bean、
@Autowired、@Serviceなどの作成されているオブジェクトを使い回すケー
スが多い
}
実務ではControllerクラスでリクエストを受け、ServiceクラスでDB接続等の
ビジネスロジックを実行するケースが多い
@Service
public class DBOperationService { }
@serviceで、このクラスがServiceクラスであることを明示的にSpringへ宣言
している
@Autowired
public hogeMapper hoge;
上記で、hogeテーブルの操作クラスであるhogeMappeクラスを使用可能な
状態にしている
各テーブルの操作クラスのことをマッパークラスと呼ぶ
@Autowiredをフィールドの変数に付加するとspring起動時にインスタンスを
生成するため使用できる状態になる
アノテーション
Springの基本 - 26 ページ
-
MyBatisが自動的生成するメソッド
プライマリーキーの設定がないテーブルからは作成されない
プライマリーキーをもとにテーブルを検索し1レコード分を
hogeオブジェクトに格納し、返却する
DBのテーブルに対応したクラスをエンティティクラスと呼ぶ
DBからエンティティクラスへの詰め替えも自動的にMyBatisが行
う
hoge.selectByPrimaryKey(id);
このメソッドは引数にエンティティクラスを受け取る
値が未設定のフィールドは無視してinsertを実行する
似たメソッドにinsertメソッドが存在するが、insert時に指定して
いないフィールドにはnullが挿入される
hoge.insertSelective(obj);
このメソッドは条件に一致したレコードを削除する
条件の指定の仕方は検索時と同じ
objクラスをインスタンス化し、createCriteria後に条件を指定す
る
deleteByPrimaryKeyメソッドも存在するが、これはプライマリー
キーをもとに削除するメソッド
更新処理も削除と変わらず、updateByExample、
updateByPrimaryKeyで処理が可能
使い方はdeleteと同じ
hoge.deleteByExample(obj)
CRUD
Springの基本 - 27 ページ
-
検索エンジンは、ユーザーが発行する検索クエリに対して高速に結果
を返す必要があり、様々な手法がある
最も単純な手法は、クエリ発行後、検索対象の文書1つ1つがクエリ単
語を含むかを検査するもの
この手法は容易に実装できるが、クエリ発行後に対象文書集合を走査
するため、対象の文書の数の増加とともに、検索時間が増大する問題
がある
これに対し、インデックスを利用すると、大量の文書集合を高速に検
索可能
どの文書が、どの単語を含むのかという情報を保存するテーブル
のこと
クエリを発行した際、インデックスを持つ検索エンジンは自身の
インデックスを調べてクエリ単語を含む文書集合を返却する
インデックス
インデックスの利用で、クエリを含む文書を収集する時間を短縮可能
インデックスを利用した検索システムと全文書のコンテンツを走査す
る検索システムを比較すると、大抵インデックスを利用した検索シス
テムの方が高速である
さらに、検索対象となる文書数(量)が増加しても、検索性能には殆
ど影響がないため、大規模データを扱う高負荷な環境では、インデッ
クスの利用は必須
検索エンジン(インデックス)
Solr - 28 ページ
-
転置インデックスは各単語と単語を含む文書IDからなるテーブル
転置インデックス
例として、2つの英語の文書(Doc1,Doc2)があり、
I have a pen, I have to go の2つであった場合、以下の表のような転
置インデックスを生成する
I 1, 2
have 1,2
a 1
pen 1
to 2
go 2
転置インデックスは連想配列を利用でき、単語をキーにして文書
ID のリストを返す
表の転置インデックス完成後に、ユーザーがpenというクエリを発行
すると、検索エンジンはpenを含む文書IDリストを返す
表では文書IDの1を返す
インデックス
Solr - 29 ページ
-
検索エンジンに文書をインデックスするには、入力文書内の文を
単語に分割する必要があり、この作業を行うのがトークナイザと
呼ばれるコンポーネントである
トークナイザには、入力文書を単語(形態素)に区切る単語単位
とN-gramの2種類がある
トークナイザ
単語単位のトークナイザを利用したインデックスには、検索クエ
リにヒットしない場合がある
研究室を研究としてクエリを発行した場合ヒットしないなど
単語単位のトークナイザ
N-gram では文をn文字単位に分割して(オーバーラップを含む)
インデックスする
N-gram トークナイザ
例えば2文字単位で研究室を分割すると研究、究室となる
研究室を含む文書は研究という部分文字列をインデックスするた
め、ユーザーがクエリ研究で検索した際、ヒットする
欠点として、N-gramインデックスはトークナイザインデックスよ
りもインデックスのサイズが大きくなる傾向がある
結果、同一の文書集合で単語ベースのトークナイザとN-gramでイ
ンデックスを生成した場合には、単語ベースの方が、検索性能が
高い場合がある
検索エンジンによっては両者を組み合わせることも可能
単語ベースと文字N-gramの両方のインデックスを生成する機能を使う
とN-gramインデックスでクエリ単語を含む文書集合を集め、トークナ
イザインデックスでヒットした検索結果にランキングを行うことがで
きる
トークンナイザ
Solr - 30 ページ
-
入力文書が、PDF、Power Point のスライドのような場合、文書データか
らテキストデータを抜き出す処理が必要になる
実現するためのツールとしてApache TikaというツールはPDFやWordを含
む多数の形式のデータからテキストコンテンツを抽出する機能を提供する
また、コンテンツをMySQLなどのデータベースに保存している場合、デー
タをコピーして直接インデックスを生成する機構をサポートする検索エン
ジンも存在する
検索対象の文書が手元にすべてある場合は、検索エンジンに手元にあ
る文書すべてを入力として渡すことが可能
インデックスの対象となる文書が手元に存在しない場合もある
クローラ
GoogleのようにWeb文書全体を対象とする検索エンジンを構築する場合
は、検索対象とする文書は手元にないため、収集する必要がある
クローラというコンポーネントはURLを巡回して未インデックスの文書や
前回の取得時から変更のあった文書を取得し順次、インデックスする
コンテンツ抽出(クローラ)
Solr - 31 ページ