事象
検索機能を実装する際、表記揺れに対応する必要が生じました。例えば、検索ワードが「東京」の場合、「とうきょう」や「トウキョウ」といったひらがなやカタカナ表記でもヒットさせる必要がありました。また、「コンビニ」というカタカナで入力された場合には、「こんびに」というひらがな表記での検索にも対応することが求められました。この記事では、Ruby on Railsを使用して、これらの表記揺れに柔軟に対応する方法を共有いたします。
また、このアプローチは、「漢字のみ」「カタカナのみ」「ひらがなのみ」といった通常のパターンだけでなく、「漢字とカタカナとひらがな」「漢字とカタカナ」「漢字とひらがな」「カタカナとひらがな」といったイレギュラーなパターンに対しても柔軟に対応できます。これは、各文字が漢字、カタカナ、またはひらがなかどうかを個別に判断し、それに応じて適切な変換を行うことにより実現されています。この方法により、多様な表記揺れに対応することが可能になり、検索機能の精度を高めることができます。
対処法
以下のコードスニペットでは、RubyのStringクラスにStringHelperモジュールを追加し、文字列の相互変換機能を実装しています。具体的には、漢字からひらがな、ひらがなからカタカナ、カタカナからひらがなへの変換機能を提供しています。
module StringHelper
require 'net/http'
require 'nokogiri'
# 漢字をひらがなに変換する
def to_kanhira
# 外部APIへのリクエスト処理
http = Net::HTTP.new('yomikatawa.com', 443)
http.use_ssl = true
path = File.join('/kanji', self)
html = http.get(path).body
result = Nokogiri::HTML(html).search('#yomikata tbody tr td').first
result ? result.inner_text : ''
end
# ひらがなをカタカナに変換する
def to_kana
tr('ぁ-ん', 'ァ-ン')
end
# カタカナをひらがなに変換する
def to_hira
tr('ァ-ン', 'ぁ-ん')
end
def with_furigana
kana = to_kanhira.to_kana
"#{kana}#{kana.to_hira}"
end
end
class String
include StringHelper
end
class Store < ApplicationRecord
def name_with_furigana(name)
return '' if name.nil?
name.with_furigana
end
def store_name
store&.name
end
def store_name_with_furigana
name_with_furigana(store_name)
end
end
参照
miyabi
というgemの機能を参照させていただきました!m(_ _)m
当初はMeilisearch
を使おうと思ったのですが、
漢字、カタカナ、ひらがなの表記揺れには弱いようでした。。
自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです!
また、なにか間違ってましたらご指摘いただけますと幸いです!