読者です 読者をやめる 読者になる 読者になる

ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Elasticsearch のインデックス解析モジュールの概要 (アナライザやトークナイザなど)

Elasticsearch

Elasticsearchkuromoji プラグイン を使用しようと思ったものの、解析 (analysis) 周りをちゃんと理解してなくて困ったりしたのでちゃんとドキュメントを読んだ。 Elasticsearch 0.90 現在の公式サイトのガイドを参考に、解析周りの概要をまとめておく。

Analysis: 解析について

インデックス時とクエリ文字列の解析 (入力された文字列をどこで区切るのか、とか) にアナライザが使用される。 インデックス解析モジュールの記述 (?) でアナライザを定義できる。 インデックス解析モジュールとアナライザの概要は次の通り。

  • インデックス解析モジュール (The index analysis module)
    • 次の 2 つの場面で使用されるアナライザ (Analyzers) を登録するのに使用する:
      • ドキュメントのインデックス時に、インデックスされるフィールド (field) を分解する (break)
      • クエリ文字列 (query strings) を処理する
    • Lucene アナライザに写像される (?)
  • アナライザ (Analyzer)
  • 解析モジュールは論理名 (logical names) の下にトークンフィルタやトークナイザ、アナライザを登録することができる *1
    • 論理名は次の箇所で使用できる:
      • マッピングの定義 (mapping definitions)
      • 特定の API
    • 解析モジュールは、組み込みのアナライザとトークンフィルタ、トークナイザを自動的に登録する (明示的に定義されていない場合)

アナライザ

アナライザについてのより詳しい話。

  • Elasticsearch には、すぐに使える組み込みのアナライザが付属している
  • あるいは、組み込みの文字フィルタやトークナイザ、トークンフィルタを組み合わせて 独自のアナライザ を作ることもできる
デフォルトアナライザ
  • マッピング定義や特定の API において、使用されるアナライザが定義されなかった場合はデフォルトのアナライザが使用される
  • デフォルトで使用されるアナライザを定義しておくこともできる
    • default という論理名のアナライザは、インデックス時と検索 API の両方でデフォルトのアナライザとして使用される
    • default_index という論理名は、インデックス時のみのデフォルトのアナライザを定義するために使用できる
    • default_search という論理名は、検索時のみのデフォルトのアナライザを定義するために使用できる
アナライザのエイリアス

アナライザにはエイリアスを張ることもできる。

index :
  analysis :
    analyzer :
      standard :
        alias: [alias1, alias2]
        type : standard
        stopwords : [test1, test2, test3]

上の例では、standard という論理名のアナライザに、alias1alias2 という名前でエイリアスを張っている。

組み込みのアナライザについて

参考ページ 「Analyzers」 に組み込みのアナライザのリストがある。

トークナイザ (Tokenizers)

トークナイザは、文字列を用語 (term) や字句 (token) の羅列に分割する。

Elasticsearch は組み込みのトークナイザを多く内蔵していて、独自のアナライザを定義するために使用することができる。 参考ページ 「Tokenizers」 に組み込みのトークナイザのリストがある。

トークンフィルタ (Token filters)

トークンフィルタはトークナイザから字句 (トークン) の羅列を受け取り、次のような処理を行うことができる:

  • トークンの変更 (例えば小文字にするなど)
  • トークンの削除 (例えばストップワード *2 の削除)
  • トークンの追加 (例えば別名の追加).

Elasticsearch には多くの組み込みトークンフィルタが内蔵されていて、独自のアナライザを定義するのに使用することができる。 参考ページ 「Tokenizers」 に組み込みのトークンフィルタのリストがある。

文字フィルタ (Character filters)

文字フィルタは、トークナイザに渡される前の文字列に対して事前処理を行うために使用される。 例えば、HTML マークアップを除去したり、「&」 という文字を 「and」 に変換するのに用いられる。

Elasticsearch には組み込みの文字フィルタが内蔵されていて、独自のアナライザを定義するのに使用することができる。 参考ページ 「Character Filters」 に組み込みの文字フィルタのリストがある。

ICU 解析プラグイン (ICU Analysis Plugin)

ICU 解析プラグインは、Unicode 正規化 (Unicode normalization)、照合 (collation)、畳み込み (folding) を考慮する。 詳細は上の参考ページや GitHub のプロジェクトページを参照。

*1:トークンフィルタの組み合わせなどに名前を付けられる、って感じだと思う

*2:ストップワード (stopwords) とは、一般的であるなどの理由で処理対象外とする単語。