LoginSignup
11
9

More than 5 years have passed since last update.

Elasticsearch で検索時のみ助詞を除外する

Posted at

はじめに

日本語の全文検索エンジンとしてElasticsearchを使おうとする時、 kuromoji を使うかと思います。

ですが、デフォルトでは全ての形態素解析した単語に関して計算をします。
例えば、クエリとして文章を入れた時、「が」や「です」も考慮して検索します。
しかし、そのようなどの文書にも出てくるような単語しかひっかからなかった場合、よくわからない文書が出てきてしまいます。

そこで、インデックス時に『助詞』を省くことが考えられますが、
後で何かに使えるかもしれないのでインデックスだけはしておきたいけど、
検索時には除外したい、を実現するにはどうするかという内容になります。

環境

$ curl -s -XGET 'http://localhost:9200' | jq '.version.number' -r
2.2.0

Analyzer の設定

Controlling Analysis の日本語がこちらにまとめられています。

analysis の設定に default_indexdefault_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": "が"
}

接続詞 になっていることがわかります。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9