0

トレーニング演習として、レストランを一覧表示する単純な Rails 3 アプリケーションがあります。レストランのインデックス ページで、1 つのテキスト フィールドを使用して名前と説明を検索できるようにしたいと考えています。

クエリのピザが与えられました。一致する必要があります

  • 名前: Tony's、説明: ... は 1950 年代から営業しているピッツェリアです ...
  • 名前: ドミノ・ピザ、説明: ...
  • 名前: The Hall、説明: ... ピザ、パスタ、ステーキ ...

なぜなら:

  1. ピザという単語は、TextMate の Cmd-T と同様のロジックを使用して、「 pizz eri a 」とあいまいに一致します。(ピッツェリアという単語のスペースは、ミニ マークダウンを機能させるためにのみ使用されます)
  2. ピザは小文字でピザにマッチします
  3. ピザはピザの部分文字列です (ends-with starts-with および includes で動作するはずです)

Rails 3でこれを行うにはどうすればよいですか? アプリケーションに、thinging_sphinx、tire、sunspot-rails、または単なるカスタム クエリを使用しますか?

4

3 に答える 3

1

誤検知を取り除く 1 つの方法は、ユーザー定義関数 (UDF) を実行して候補の回答と元の文字列の間の編集距離を計算し、編集距離が大きすぎる回答を無視することです。

于 2012-10-25T05:52:26.307 に答える
1

唯一難しいのはピザ/ピッツェリアで、ステミングと呼ばれる問題です。

sphinx と solr/sunspot の両方がステミングをサポートしていますが、ピザはピッツェリアのステムであることを両方に教える必要があると思います。

于 2012-10-21T02:53:45.970 に答える
0

私のニーズを満たす非常にシンプルなソリューションを見つけました。

"%#{"pizza".scan(/./).join("%")}%"

これにより、次のような文字列が作成されます

"%p%i%z%z%a%"

次に、それを LIKE クエリで使用すると、期待どおりの結果が得られます。残っているのは、関連性の順序を決定するという重要な問題を解決することだけです:)

アップデート:

短い文字列は長い文字列よりも近い一致である可能性が高いという仮定に基づいて、関連性の順序を決定する手っ取り早い汚い方法を見つけました。

ORDER BY length(sequence) ASC
于 2012-10-21T11:34:05.820 に答える