Elastic Searchでkuromojiを使ってみる

ElasticSearchのコマンド集

この記事はElasticSearchを始めたNな人が使ったコマンドの備忘録です。
間違ってたらごめんちゃい。

形態素解析(分かち書き)をやってみる

デフォルト設定

GET /_analyze
{
  "text": "今日はとてもいい天気ですね"
}

今 / 日 / は / と ...
のように、一文字ずつで解析されている。

kuromojiを使ってみる

GET /_analyze
{
  "tokenizer": "kuromoji_tokenizer",
  "text": "今日はとてもいい天気ですね"
}

今日 / は / とても...
のように、品詞単位(形態素)で解析される。

新しいIndexを作る

ElasticSearchのIndxexは、MySQLで言うSchemaですね。

通常のIndex

まずは、normalスキーマを作ってみましょう。

PUT /normal

kuromoji

今回はkuromojiスキーマを作ってみましょう。
検索用のアルゴリズムにkuromojiを使うように設定します。
ちょっとわかりにくいですが、
「sentenceテーブル」の「textカラム」に対してkuromojiで解析を行うように設定します。

さらに、「mapping」というものを設定してやってます。
こいつがkuromojiを使う上で重要で、「このカラムはkuromojiで解析してね!」という情報をもたせてやります。

PUT /kuromoji
{
  "mappings": {
    "sentence": {
      "properties": {
        "text": {
          "type": "text",
          "analyzer": "kuromoji",
          "term_vector": "with_positions_offsets"
        }
      }
    }
  }
}

Indexを削除

今作ったnormal Index(スキーマ)を削除します。

DELETE /normal

Indexの確認

kuromoji Index(スキーマ)の中身を確認します。

GET kuromoji/_mapping

データの投入

MySQLでは、スキーマとテーブルが必要ですが、
ElasticSearchはテーブルはデータ投入時に自動で作成してくれます。

実際に投入してみる

以下、kuromojiスキーマ の中に sentenceテーブル を作り、
sentenceテーブルtextカラム に文章を入れているイメージです。

POST kuromoji/sentence
{
  "text": "日本酒は水"
}

POST kuromoji/sentence
{
  "text": "梅酒は命"
}

POST kuromoji/sentence
{
  "text": "ウイスキーは火酒"
}

検索してみる

以下のクエリーで検索できます。

GET kuromoji_test/sentence/_search
{
  "query": {
    "match": {
      "text": "酒"
    }
  }
}

このクエリーで引っかかるのは、「日本酒は水」のみです。
なぜでしょうか。

それは、形態素解析の仕組みを考えるとわかります。
実際に形態素解析してみましょう。

  • 日本酒は水:「日本」「酒」「は」「水」
  • 梅酒は命:「梅酒」「は」「命」
  • ウイスキーは火酒:「ウイスキー」「は」「火酒」

上記の結果から「酒」でマッチするのは「日本酒は水」だからですね。

また、ここで気をつけないといけないのが、「は」などの助詞はなぜか省かれるということす。
多分検索の類似度算出時にノイズになるから省かれているんでしょうね…

もうちょっと遊んで見る

先程のデータをすべて削除し、次のデータを入れてみます。

POST kuromoji/sentence
{
  "text": "あるところに、かわいそうな乞食の子がありました。"
}

POST kuromoji/sentence
{
  "text": "さびしい村の方から、毎日、町の方へ、ものをもらいに追い出されました。けれど、小さな足には、なにもはくものがなかったのです。子供は跣足で、長い石ころの多い道を、とぼとぼと歩かなければならなかったのでした。"
}

POST kuromoji/sentence
{
  "text": "夏の暑い日のことであります。地の面は乾いて、石は、熱く焼けていました。しかし子供は、足になにもはくものがなかったので、その上を跣足で歩いていました。通りすがりの人たちは、このかわいそうな乞食の子を見ましても、やさしい声ひとつ、かけてくれるものはありませんでした。"
}

※青空文庫より、長ぐつの話


GET kuromoji/sentence/_search
{
  "query": {
    "match": {
      "text": "さびしい村の方"
    }
  }
}

上記で検索すると、余計な語句が除外されるので、ピッタリ

さびしい村の方から、毎日、町の方へ、ものをもらいに追い出されました。けれど、小さな足には、なにもはくものがなかったのです。子供は跣足で、長い石ころの多い道を、とぼとぼと歩かなければならなかったのでした。

だけがヒットします。
いい感じですね

参考

[PR] おすすめの本
この記事を書いた人
Nな人(えぬなひと)。
Nは本名から取っています。
Laravelが大好きなPHPerで、WEBを作るときはLaravelを技術スタックに絶対推すマン。
PHP、Pythonと、昔はperlを書いていたP言語エンジニア。
最近はNimを書いたりしています。