0

私は自分のウェブサイトを検索しましたが、今日、たとえば投稿に「implicación en el proyecto」などの説明があり、アクセントなしで「implicación en el proyecto」という単語を使用してこの投稿を見つけようとすると、取得できないことがわかりました。どんな結果でも、アクセント付きの文字 o を使用して「implicación」を試してみると、投稿が見つかりました。

この検索を修正するにはどうすればよいですか。ユーザーがアクセントなしで単語を使用している場合でも、投稿を見つける必要があります。

これは私のモデルでの実際の検索です。私は本番用にpostgresqlを使用しています。

find(:all, :conditions => ['title LIKE ? OR title LIKE ? OR description LIKE ? OR description LIKE ?', "%#{search}%", "%#{search.capitalize}%", "%#{search}%", "%#{search.capitalize}%"] )

よろしくお願いいたします。

編集


private

    def pg_strip_accents(field)
          "<<EOS
          translate(
            LOWER(#{field}),
            'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ',
            'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu'
          )
          EOS"
        end


    def self.search(search)
        if search.present?
                where("#{pg_strip_accents('title')} LIKE :search OR #{pg_strip_accents('description')} LIKE :search", 
          :search => "%#{search.downcase}%")
        else
            find(:all)
        end
      end
4

1 に答える 1

0

ここに示すように、postgresqltranslate関数を使用してこれを行うことができます。また、テストする前に両側を大文字または小文字に変換すると、検索用語の量を半分にすることができます。

where(<<EOS
translate(
  LOWER(title),
  'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ',
  'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu'
)
LIKE :search OR
translate(
  LOWER(description),
  'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ',
  'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu'
)
LIKE :search
EOS }, :search => "%#{search.downcase}%")

リンクに示されているように、専用の関数を作成して、これを再利用しやすくすることができます。または、Ruby コードを使用してそれを行うこともできます。

def pg_strip_accents(field)
  <<EOS
  translate(
    LOWER(#{field}),
    'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ',
    'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu'
  )
  EOS
end

where("#{pg_strip_accents('title')} LIKE :search OR #{pg_strip_accents('description')} LIKE :search", 
          :search => "%#{search.downcase}%")
于 2012-12-31T18:06:03.500 に答える