Elasticsearch 日本語で全文検索 その3

Elasticsearch Japanese Analysis — 日本語全文検索の為のカスタムアナライザー

Kunihiko Kido
Hello! Elasticsearch.

--

その1、その2で説明してきた内容をふまえ、日本語全文検索向けのアナライザーを考えてみました。

日本語全文検索のためのアナライザー

次の設定サンプルは、基本的な日本語検索の為の ja アナライザーと、ja アナライザーにプラスして同義語検索を実現する為の ja_synonym アナライザー、Nグラム検索用の ja_ngram アナライザーを定義しています。

実際に使用する際には、これらの3つのアナライザーをフィールド毎に使い分けて使用することで、いろいろなシーンで活用できるはずです。

# 設定サンプル
# edit: $ES_HOME/config/elasticsearch.yml
index:
analysis:
filter:
synonym:
type: synonym
synonyms_path: analysis/synonym.txt
stopword:
type: stop
stopwords_path: analysis/stopword.txt
katakana_stemmer:
type: kuromoji_stemmer
tokenizer:
default_ja_tokenizer:
type: kuromoji_tokenizer
mode: search
user_dictionary: analysis/user_dict.txt
ngram_ja_tokenizer:
type: nGram
min_gram: 2
max_gram: 3
token_chars: [letter, digit]
analyzer:
ja:
alias: [index_analyzer]
type: custom
tokenizer: default_ja_tokenizer
char_filter: [
html_strip,
kuromoji_iteration_mark
]
filter: [
lowercase,
cjk_width,
katakana_stemmer,
kuromoji_part_of_speech,
stopword
]
ja_synonym:
alias: [search_analyzer]
type: custom
tokenizer: default_ja_tokenizer
char_filter: [
html_strip,
kuromoji_iteration_mark
]
filter: [
lowercase,
cjk_width,
katakana_stemmer,
kuromoji_part_of_speech,
synonym,
stopword
]
ja_ngram:
type: custom
tokenizer: ngram_ja_tokenizer
char_filter: [html_strip]
filter: [
cjk_width,
lowercase
]

ja アナライザー (alias : index_analyzer)

適合率を重視した基本的な日本語全文検索のためのアナライザーです。動詞、形容詞を原型に変換するフィルターはあえて入れていませんので、必要であれば入れてください。また、品詞の除外は接続詞、助詞、記号など kuromoji_part_of_speech フィルターのデフォルトを使用しています。詳細は lucene-analyzer-kuromoji.jar に含まれる stoptags.txt を確認してください。

ja_synonym アナライザー (alias : search_analyzer)

ja アナライザーの設定内容に加え、同義語を展開できるアナライザーです。インデックス側または、サーチ側のいずれかのアナライザーで使用することを想定しています。(※ 両方で同じ同義語展開してもあまり意味がないため。)

インデックス側、サーチ側の両方で同義語展開したい場合は、ja_index_synonym、ja_search_synonym と言うようにそれぞれ定義をわけ、インデックス側の辞書はほとんどメンテナンスしない一般的な同義語を管理し、サーチ側は新語などのコンテンツの内容によって追加変更しそうな同義語を管理するなどしてください。

インデックス側の同義語辞書

インデックスに反映されるため、辞書をメンテナンスした場合は、ドキュメントをインデックスし直すまで反映されません。そのかわり検索時には辞書は展開されないため、検索のパフォーマンスにはそれほど影響しない。

サーチ側の同義語辞書

検索時に同義語が展開されるため、辞書をメンテナンスして、ドキュメントの再インデックス無しに、反映することができます。そのかわり、同義語展開後のクエリがあまりにも大きい場合は、検索のパフォーマンスに影響する可能性があります。

ja_ngram アナライザー

再現率を重視した日本語全文検索のためのアナライザーです。Nグラムベースの設計でメインで使用するか、形態素解析ベースの設計で、一部のフィールドのみで使用することを想定しています。

仕組み的にはNグラムでも同義語の展開はできますが、辞書に登録する単語をNグラムで分割して登録するなど敷居が高く、検索結果が膨らみすぎて、なんだか分けのわからない検索結果になりそうなので、あえて、Synonym フィルターは入れていません。

半角・全角の統一など、Char Filter で処理させたい文字単位のフィルターがなぜかないため、Token Filter 側で設定していたりと、まだ改善の余地はありますが、とりあえずこんな感じでどうでしょうか?

--

--