

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

## やりたいこと

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」などといれても東京がサジェストされるのですが、  
いったい彼らはどうやって実装してるんですかね。。。


CC BY-SA 4.0
2017-10-03T06:26:23.067
38385
2020-07-24T06:01:10.707
2020-07-24T05:57:07.497
19110
25065
question
ruby-on-rails mysql aws elasticsearch
検索エンジンを実装するにあたり、「とう」や「tok」、「東」というインプットから「東京」という結果をサジェストして欲しい


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

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

  * [Elasticsearch キーワードサジェスト日本語のための設計](https://medium.com/hello-elasticsearch/elasticsearch-%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%B5%E3%82%B8%E3%82%A7%E3%82%B9%E3%83%88%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E8%A8%88-352a230030dd) \-- Hello! Elasticsearch
  * [日本語でのサジェストの難しさとElasticsearchを用いた実装例](http://techblog.housmart.co.jp/2016/12/16/suggester-for-japanese/) \-- カウル Tech Blog

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

  * [Solrを用いて検索のサジェスターを作りました](https://techblog.zozo.com/entry/solr-suggester) \-- ZOZO Technologies TECH BLOG


CC BY-SA 4.0
2020-07-24T06:01:10.707
68888
2020-07-24T06:01:10.707
19110
38385
answer