この記事を書いた背景・目的
業務でElasticsearchを触る機会が有りました。
全文検索エンジンというものを初めて触り、全文検索の仕組み、「どのように曖昧な検索を実現しているのか」といった点に興味を持ったので記事にしようと思いました。
まず、Elasticsearchの全文検索を理解する上で前提知識となるText analysisと転置インデックスについて解説します。
Text analysis
Text analysisは以下の3つの処理から構成されます。文書から単語(token)に変換する処理を指します。
- Character filter
- Tokenizer
- Token Filter
Character filter
文書全体の前処理を行います。
たとえば、HTMLタグを除外するHTML strip character filter
、日本語の繰り返し文字(「ゝ」や「々」)を修正するkuromoji_iteration_markなどがあります。
Tokenizer
文書を個々の単語に分割します。文書から分割された単語をtokenと言います。
例:
もとの文章: A full-text search engine!
Tokenizer: [A, full, text, search, engine]
Tokenizerには様々な選択肢があります。特に日本語のように単語の切れ目がわかりづらい言語に対しては、N-gram tokenizerや形態素解析によるkuromoji_tokenizerを用います。
Token Filter
tokenの加工を行います。
例えばアポストロフィを取り除くApostorophe token filter、tokenを小文字にするLowercase token filter、ストップワード(a や theなど、特に意味を持たない単語)を取り除くStop token filterなどがあります。
転置インデックス
転置インデックスをWikipediaで検索すると以下のように記載されています。
全文検索を行う対象となる文書群から単語の位置情報を格納するための索引構造をいう
今まで出てきた用語で言い換えると「tokenがどのドキュメントで使われているかを格納するためのインデックス」となります。
例:
次のような、文書をドキュメント登録するとします。
id | text |
---|---|
1 | Full-text search engine! |
2 | Car engine |
転置インデックスは以下のようになります。
token | id |
---|---|
full | 1 |
text | 1 |
search | 1 |
engine | 1,2 |
car | 2 |
全文検索による検索
上記に説明したText Analysisと転置インデックスの仕組みを用いてElasticsearchは全文検索することができます。
① document登録時:Text Analysisした結果を転置インデックスに格納します
② 全文検索:文書解析の結果のTokenを転置インデックスで検索します。より多くの転置インデックスにヒットしたdocumentを、より検索にマッチした結果として返却します。(検索とのマッチ度合いはscoreというパラメータで表現されます)
検索観点での全文検索エンジンの特徴
データストアとしてよく用いられるRDBと比較して、全文検索エンジンの特徴を以下にあげます。
- 曖昧な検索が可能
- RDBの検索では指定した条件に完全に合致したもののみが返却されます。一方で、全文検索を用いた検索では、一部の検索キーワードに合致したものも返却することができます。
- スコアリング
- RDBの検索では条件に合致したレコードのリストが返りますが、そのリストの中で優劣はありません。全文検索の場合、「score」により検索条件とのマッチ度合いを表現することができます。