2011-10-29 11 views
6

クライアントには、AJR Kelly Ltdなどのデータベースに保存されている会社のように、ユーザーの入力に応じていくつかの形式で検索できる会社名を検索するかどうかを尋ねるユーザーがいます。ユーザー"AJR Kelly"を検索します。MySQL LIKE%string%はあまり寛容ではありません。他に何か使えますか?

<cfif pctermsCount gt 0> 
AND (LOWER(p.name) LIKE '%#pcTerms#%') 
</cfif> 

は、彼らは「ケリー」を検索した場合、会社が発見されたが、彼らは「J・ケリー」または「AJケリー」のような文字列の壊れたバージョンを検索する場合、それが見つからないです。

ちょっと寛容にするためにできることはありますか?

ありがとうございました。

答えて

8

MyISAMを使用している場合は、フルテキストインデックスを使用できます。 See this tutorial

別のストレージエンジンを使用している場合は、storage engine for mysqlとして動作するサフィックスフルテキストエンジン、または照会できる別のサーバーを使用できます。 MySQLの本文

A J Kelly上の検索のインデックスを作成すると、AJ Kellyと一致しますが(問題を混同するのではなく、彼らは、デフォルトでは短すぎるとしてA、JとAJは無視されるだろうと、それはケリーに一致していない。)一般的に全文がはるかにあります(そして通常はLIKE '%string%'よりも速い)部分的な一致を可能にするので、関連性の上でランク付けすることができます。

また、SOUNDEXを使用して、単語の発音に相当するものを索引付けし、SOUNDEXを検索条件に適用して索引を検索し、それらを使用して索引を検索することで、より寛容な検索を行うこともできます。 soundex maryの場合、mariemarryはすべて一致します。

+0

MyISAMを使用しています。私はFullTextを検討したので、テーブル上でそれを有効にできることをテストしました。私はまだそれを試していません、なぜなら、それはユーザーインターフェイス上でそれを与えるためのかなりの手間がかかりますが、私はPHPMyAdminのクライアントにいくつかの例を示しますが、私はFullText彼の好みにあまりにも寛大であるかもしれない。ご回答有難うございます。フルテキストは、彼が問題に生きることができないなら、最高の解決策であるようです。 –

+0

UIに手を加える必要はありません。あなたは同じ検索文字列を取ってWHEREに '(ブールモードでは 'AJ Kelly'に対して)MATCH(indexcol)、ブールモードでは 'AJ Kelly'に対してORDER BY MATCH(indexcol)DESC' –

+0

申し訳ありませんが、私は不明でした。 「ユーザーインターフェイス」とは、ウェブサイト自体のバックエンドコードを意味していました。たくさんの場所から来ているたくさんのものをベースにしたかなりのクエリビルドがあります。かなり複雑ですので、フルテキストの結果を彼に見せることでテストするのは簡単ですPHPMyAdminでは、バックエンドコードに多くの変更を加えて試してみます。申し訳ありませんが、そのクエリのスニペットを投稿してくれてありがとうございました。 :D –

1

トリッキーなことに、データベース検索で空白を削除するのが簡単な方法だと思うので、A J R Kellyの代わりにAJRKellyが使用されています。次に、個々の検索語句のためのセパレータとして空白を使用します。そうすれば、J KellyはA、J、Kellyを別々に検索します。 AJケリーはAJとケリーを別々に探します。 AJRKellyの空白を削除したデータベース用語に一致します。

+0

これは実際には狭いユースケースをカバーし、正確な一致しか許さず、効率的に実装するのが難しいでしょう。検索する各列に2つの列があります(1つは空白なし)。空白は除外されてから同様の処理が実行されます(非常に高価になります)。 –

2

空白を削除して新しい列を作成し、それを検索可能なバージョンにして、列データ型をFULLTEXT(MyISAMでのみ機能する)として設定できます。あなたはLucene/SOLRを調べることもできます。 SOLRは、この種の状況で非常にうまく機能する多くのトークナイザを提供します。学習曲線はかなり高いですが、長期的にはそれに見合った価値があります。

4

実際にColdFusionを実行している場合は、VerityまたはSolr/Luceneのいずれかを使用してCFの全文索引付けにアクセスできます。どちらの文字列でも、文字列の「ファジーマッチング」機能が優れているはずです。

MyISAMテーブルを使用することは、フルテキストインデックス作成のための苦いピルです。あなたは安心して、Foreign Keyの制約のようなものをたくさん残します。

関連する問題