TransWikia.com

検索エンジンを実装するにあたり、「とう」や「tok」、「東」というインプットから「東京」という結果をサジェストして欲しい

スタック・オーバーフロー Asked by Asuka on December 24, 2021

下記を実現するにはどうやるのがよいでしょうか?
自分なりに考えた実現方法案も後述しましたので、それらも参考にしていただけると幸いです。
よろしくお願いします。

やりたいこと

APIのパラメーターで文字列を渡す。それをキーにテキストリストから検索をしたい。
具体的には、「とう」や「tok」、「東」というインプットにたいして、
後述の都道府県リストから「東京」という結果を取得したい。
「とう」のときに「糖分」がひっかかるのはOK

単語リスト

東京
京都
大阪
北海道
福岡
糖分

※ 文章ではなくて、すでに単語レベルにパースされてるという前提で大丈夫です
※ レコード数は多くても数百(パフォーマンスは問題にならないかと)

環境

Rails 4.2.6
AWS EC2 + RDS for MYSQL 5.7

実現方法案

  1. 普通にMySQLでlike検索
    「東」と入力しないとひっかからない
    平仮名、アルファベットのカラムを用意してそこからもlike検索をすれば、
    平仮名でもアルファベットでもOK?
    ※ レコード数は多くないので、速度は気にしません。
    ※ kakasiが使えそう

  2. MySQL5.7でのfull-text index
    1と同様で、平仮名、アルファベット、漢字のそれぞれの転置インデックスを作らないとダメ。
    ※ 参考までに、RDSではNグラムパーサーしか使えません。

  3. Elastic search
    いれるのが大変そう(試してない)。今回はそこまでコストかけずに実装したい
    Kuromojiをいれれば、漢字と読みの紐付けはできる

  4. 他になにかあれば

その他

googleだと検索する時に「とうky」などといれても東京がサジェストされるのですが、
いったい彼らはどうやって実装してるんですかね。。。

One Answer

Elasticsearch を使い、ローマ字読みの field を用意して前方一致で解決するのが良いかな……と思います。正規化のために適宜マッピング等も利用すると思います。

実際の実装は少し長くなるので、同様のことをしているブログ記事をいくつか置いておきます。

Elasticsearch でなくて Solr を使う例も見つけたのでこちらもリンクを置いておきます。

Answered by nekketsuuu on December 24, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP