1

現在、Web サイトの検索機能を開発しています。ユーザーは他のユーザーを名前で検索します。名前にアクセントのあるユーザーに対して良い結果を得るのに苦労しています。

name 列に FULLTEXT インデックスがあり、テーブルの照合順序は utf8_general_ci です。

現在、誰かがサイトに登録し、アクセント付きの名前 (例: Alberto Andrés) を持っている場合、その名前は次の画像に示すように DB に保存されます。

アルベルト・アンドレ

したがって、次のクエリを実行すると、SELECT * MATCH(name) AGAINST('alberto andres')「Alberto」、「Andres」、「Andrés」などのより良い一致スコアを持つ多くの結果が得られ、最後に、ユーザーがおそらく「Alberto Andrés」を探しているレコードの低い一致スコアが得られます。

アクセント付きレコードが現在 DB に格納されている方法を考慮するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

2

エル・セニョール・アンドレスの姓が実際に正しく保存されているように見えます。あなたが私たちに示したレンダリングは、一部の非 UTF アプリが UTF8 テキストをマングルする方法です。

テーブルに大量のレコードがまだない場合は、このクエリの変更を試すことができます。フルテキスト (非ブール値) モードは、小さなデータ セットで奇妙に動作します。

SELECT *  
  FROM TABLE
WHERE MATCH(name) AGAINST('alberto andres' IN BOOLEAN MODE)

あなたも試すかもしれません

SELECT *  
  FROM TABLE
WHERE MATCH(name) AGAINST(CONVERT('alberto andres' USING utf8))

一致する文字列が MySQL 列と同じ文字セットであることを確認するだけです。

于 2013-02-08T14:41:08.127 に答える