0

私のレールアプリでは、コードの一部であるmysqlデータベースからデータを取得しています:

@search = ArtLookup.find(:all, :conditions => ['MATCH (ARL_SEARCH_NUMBER) AGAINST(? IN BOOLEAN MODE) and ARL_KIND = 1', search_condition.gsub(/[^0-9A-Za-z]/, '')])

しかし、主な問題は、さまざまなサプライヤーの価格表があり、データベース内の同じ変数に対して異なるコーディングがあります。たとえば、次のようになります。

LEMFÖRDER

しかし、たとえばsearch_conditionmy が次のようになるように、my の辞書を設定するにはどうすればよいですか。search_condition

LEM?FORDER or
LEMFOERDER or
LEMFÖRDER

LEMFÖRDERそれは私のデータベースを見つけますか?

非常に奇妙に聞こえるかもしれませんが、私の英語で申し訳ありませんが、私の例ですべて説明します...

4

3 に答える 3

1

この場合、Solr や Sphinx などの全文検索と追加の検索機能に対応するライブラリの使用を開始する必要があると思います。

http://pat.github.com/ts/en/searching.htmlを見てください。

この種の複雑さは一般的であり、多くのアルゴリズムで既に実装されています。

それが役に立てば幸い!

于 2012-12-14T16:27:00.277 に答える
0

次のようにActiveRecordのARELエンジンを使用してこれを行うことができます。

def lookup(*alternatives)
  match_condition = 'MATCH (ARL_SEARCH_NUMBER) AGAINST(? IN BOOLEAN MODE)'

  or_conditions = alternatives.map do |alternative|
    ArtLookup.where(match_condition, alternative).
    where_values.reduce(:and)
  end

  and_condition = ArtLookup.where('ARL_KIND = 1').where_values.reduce(:and)

  # Build a disjunction
  conditions = or_conditions.shift

  or_conditions.each do |condition|
    conditions = conditions.or(condition)
  end

  # Build the final conjunction
  conditions = conditions.and(and_condition)

  ArtLookup.where(conditions)
end

次に、次のようなオブジェクトを見つけることができます。

@search = lookup('LEM?FORDER', 'LEMFOERDER', 'LEMFÖRDER')

または、配列を直接提供します。

alternatives = [
  'LEM?FORDER',
  'LEMFOERDER',
  'LEMFÖRDER'
]

@search = lookup(*alternatives)

私は、これが単純なことを行うにはコードが多すぎるという事実を認識しています。しかし、それはそれを行うべきであり、私ははるかに良い方法を知りません。私はそのコードをテストしなかったので、いくつかの小さな間違いが含まれている可能性があります。

于 2012-12-12T04:49:19.480 に答える
0

私があなたの質問を正しく理解していれば、Mysql にこれら 3 つの値を同じものとして扱わせたいと思うでしょう。これらが特定の言語 (たとえば、ドイツ語の ß = ss) で同じものと見なされると仮定すると、Mysql は照合設定に基づいてこれを自動的に処理するため、正しい照合を選択すると修正されるはずです。

于 2012-11-29T13:59:00.877 に答える