はじめに
日本語の全文検索エンジンとしてElasticsearchを使おうとする時、 kuromoji
を使うかと思います。
ですが、デフォルトでは全ての形態素解析した単語に関して計算をします。
例えば、クエリとして文章を入れた時、「が」や「です」も考慮して検索します。
しかし、そのようなどの文書にも出てくるような単語しかひっかからなかった場合、よくわからない文書が出てきてしまいます。
そこで、インデックス時に『助詞』を省くことが考えられますが、
後で何かに使えるかもしれないのでインデックスだけはしておきたいけど、
検索時には除外したい、を実現するにはどうするかという内容になります。
環境
$ curl -s -XGET 'http://localhost:9200' | jq '.version.number' -r
2.2.0
Analyzer の設定
Controlling Analysis の日本語がこちらにまとめられています。
analysis
の設定に default_index
と default_search
があるので、インデックス時と検索時のアナライザーを分けることができます。
品詞によるフィルターの設定
この記事にも書いてありますが kuromoji_part_of_speech というトークンフィルターが用意されています。
実際に使ってみる
Sense
を起動して下記ページを開いて実際に動かしてみてください。
インデックスの設定をする
PUT kuromoji_sample
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"default_index": {
"type": "custom",
"tokenizer": "kuromoji_tokenizer"
},
"default_search": {
"type": "custom",
"tokenizer": "kuromoji_tokenizer",
"filter": [
"stop_posfilter"
]
}
},
"filter": {
"stop_posfilter": {
"type": "kuromoji_part_of_speech",
"stoptags": [
"助詞-格助詞-一般",
"助詞-終助詞"
]
}
}
}
}
}
}
形態素解析の結果を確認する
Explain API を使って、
形態素解析した品詞の結果を単語毎に確認します。
GET kuromoji_sample/_analyze?explain
{
"text": "寿司が美味しいね"
}
が
が 助詞-格助詞-一般
、 ね
が 助詞-終助詞
に分類されているのがわかります。
データを保存
POST kuromoji_sample/document
{
"text": "寿司が美味しいね"
}
助詞以外の単語を変えて検索してみる
寿司
を 料理
に、 美味しい
を うまい
に変えてみました。
GET kuromoji_sample/document/_search
{
"query": {
"simple_query_string": {
"query": "料理がうまいね",
"fields": ["text"]
}
}
}
結果はヒット数0になるはずです。
助詞がインデックスされていることを確認する
が
だけで検索してみます。
GET kuromoji_sample/document/_search
{
"query": {
"simple_query_string": {
"query": "が",
"fields": ["text"]
}
}
}
先ほど登録した 寿司が美味しいね
がヒットすると思います。
これは が
単体のクエリでは形態素解析の結果が 助詞
になっていないからです。
確認してみます。
GET kuromoji_sample/_analyze?explain
{
"text": "が"
}
接続詞
になっていることがわかります。