5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Elasticsearchでカタカナも引っ掛かるようにしたい!【kuromoji】

Posted at

悩み

Elasticsearchで色々検索しなければいけない機会があり、その時に「あれ?これカタカナで検索しても引っかからないぞ???」となって大変困ったことになりました。
例えば、「ライトセイバー」を「らいとせいばー」と検索しても引っかからなかった訳です。

この時、色々調べてなんとかなったので、それをまとめてみました。
この記事では、この問題の解決法しか書いていないので、
「そもそもElasticsearchとは?」みたいな説明はしませんので、ご注意ください。

初手結論

indexのsettingsにこれを追加すればできるようになりました。
analyzerkuromojifilter部分はお好みで追加したり、削除したりしてください。

"analysis" : {
  "filter" : {
    "kuromoji_multiplexer" : {
      "type" : "multiplexer",
      "filters" : [
        "lowercase",
        "lowercase, porter_stem",
        "kuromoji_readingform"
      ]
    }
  },
  "analyzer" : {
    "kuromoji_analyzer" : {
      "filter" : [
        "kuromoji_part_of_speech",
        "cjk_width",
        "kuromoji_stemmer",
        "lowercase",
        "kuromoji_multiplexer"
      ],
      "char_filter" : [
        "icu_normalizer"
      ],
      "tokenizer" : "kuromoji_tokenizer"
    }
  }
},

詳しく説明していきます。

まずは"flter"の部分でカスタムフィルターを定義しています。(ここではkuromoji_multiplexe

ここで重要なのは"type": "multiplexer"の部分です。
Elasticsearchのmultiplexerのタイプをつけた場合、そのフィルターは一つの検索後に対して複数のトークンを作成してくれます。
例えば、「this is a pen」と検索した場合、「THIS IS A PEN」とも検索してくれるような感じですね。

この時の小文字から大文字への変換をどうするか?というのを決めるのが"filter"の項目になります。
今回はフィルターにlowercaselowercase, porter_stemkuromoji_readingformの三つのフィルターを指定していますので、これらを使ってトークンを別の文字列として複製してくれます。

(kuromoji_readingformでは「だいふく」を「ダイフク」とも検索してくれます。)

そして、"analyzer"項目の"filter"部分で先ほど作ったカスタムフィルターであるkuromoji_multiplexeを追加しています。
これで、ひらがなで検索した際にもカタカナのものが検索に引っ掛かるようになりました!

5
4
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
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?