2017-01-30 10 views
1

私はタイトルと歌詞を格納するアプリを持っています。一部の曲はスペイン語であり、çccéntsを含んでいます。私はユーザーがアクセントなしで単語を入力できる検索方法を書こうとしています。たとえば、タイトルに「papá」という単語があるとします。ユーザーが「papa」と入力すると、タイトルにその単語のある曲が見つかるはずです。アクセント付き文字で検索

これはこれまで私が行ってきたことです。ワイルドカードを処理し、3つの列を検索します。

search_phrase = "number #{like} ? OR title COLLATE Latin1_general_CI_AI #{like} ? OR lyrics #{like} ?" 

CIは大文字と小文字を区別しないの略で、AIがアクセントを区別しないの略:

class Song < ApplicationRecord 
    def self.search(query) 
    return all unless query.present? 

    # for case insensitive search 
    like = Rails.env.production? ? 'ILIKE' : 'LIKE' 

    # for wildcards 
    q = ["%#{query}%"] * 3 

    # columns that I will search through song.number, song.title, song.lyrics 
    search_phrase = "number #{like} ? OR title #{like} ? OR lyrics #{like} ?" 

    where([search_phrase] + q) 
    end 
end 
+0

postgresqlを使用していますか? – kurenn

+0

@kurenn私は生産になります –

答えて

0

COLLATE Latin1_general_CI_AIまたはpgセットアップがうまくいかない場合は、これを試してください。列が重複し、1つがアクセントになっています。クレジットはthisthisになります。私の移行を

class Song < ApplicationRecord 
    before_save :i18n 

    def self.search(query) 
    return all unless query.present? 

    like = Rails.env.production? ? 'ILIKE' : 'LIKE' 

    q = ["%#{query}%"] * 3 

    search_phrase = "number #{like} ? OR ai_title #{like} ? OR ai_lyrics #{like} ?" 

    where([search_phrase] + q) 
    end 

    def i18n 
    self.ai_title = I18n.transliterate title 
    self.ai_lyrics = I18n.transliterate lyrics 
    end 
end 

ように見える:それは多くのデータベースのセットアップのために働く

class CreateSongs < ActiveRecord::Migration[5.0] 
    def change 
    create_table :songs do |t| 
     ... 
     t.string :title 
     t.string :ai_title, index: true 
     t.text :lyrics 
     t.text :ai_lyrics, index: true 
     ... 
    end 
    end 
end 

。私はこれが本当に便利だと思う。

2

あなたは照合を使用することができます。

0

この使用のPostgreSQLを達成するための最良の方法は、unaccent拡張子を追加することです:あなただけの結果を照会したいときに

class AddUnaccentExtension < ActiveRecord::Migration 
    def change 
    enable_extension "unaccent" 
    end 
end 

をそして:

search_phrase = "unaccent(number) #{like} unaccent(?) OR unaccent(title) #{like} unaccent(?) OR unaccent(lyrics) #{like} unaccent(?)" 

は心の中で、この意志を持っていますpostgresqlでしか動作しません、開発データベースとして使用することをお勧めします。奇妙なことを防ぐために

関連する問題