これは非常に複雑になる可能性があり、存在することは確かですが、私は個人的に優れたサードパーティのライブラリを認識していません。ただし、他の人はいくつかの定型的な解決策を提案できるかもしれません.
私は過去に何度かゼロから似たようなことを書きました。そのルートをたどると、すべてのクエリですべてのレコードを取得し、それらに対して計算を実行する必要があるため、PHP だけで実行したいとは思わないでしょう。ほぼ確実に、仕様を満たす一連のインデックス テーブルを作成する必要があります。
たとえば、「Milwaukee」が最終的に「milwakee」と綴られる可能性があると想像する方法について、ルールを考え出す必要があります。これに対する私の解決策は、母音圧縮と重複圧縮を行うことでした (これらが実際に検索用語であるかどうかはわかりません)。したがって、ミルウォーキーは次のようにインデックス付けされます。
- ミルウォーキー
- m_lw__k__
- m_lw_k_
「milwaukee」の検索クエリが入ってきたら、テキスト入力に対して同じプロセスを実行してから、インデックス テーブルで次の検索を実行します。
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw__k__', 'm_lw_k_')
"milwakee" の検索クエリが入ってきたら、テキスト入力に対して同じプロセスを実行し、インデックス テーブルで次の検索を実行します。
SELECT cityId,
COUNT(*)
FROM myCityIndexTable
WHERE term IN ('milwaukee', 'm_lw_k__', 'm_lw_k_')
Milwaukee (スペルが正しい) の場合、カウントとして "3" が返されます。
Milwakee (スペルが間違っている) の場合、カウントとして "2" が返されます (m_lw__k__
中央に母音が 1 つしかなく、パターンに一致しないため)。
カウントに基づいて結果を並べ替えると、「Milwaukee」が「Milwakee」よりも上位に並べ替えられるというルールの 1 つを満たすことになります。
このシステムを一般的な方法で構築したい場合 ($table
クエリで を使用することで示唆されているように)、用語を適切なテーブルにマップするために別のマッピング テーブルが必要になる可能性があります。
これが最善の(または良い)方法であると示唆しているわけではありません.サードパーティのソリューションなしでこれを試してみる場合に役立つかもしれない過去に私が行ったことです.