6

検索語とフィールドのスペースを無視して、フィールドを検索する良い方法は何でしょうか?

例:

SELECT * 
FROM tablename
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%'

実際の例:

私のクライアントは、ロング ブロック エンジンを販売する Web サイトを運営しています。ただし、サイトで「cat 3306 longblock」の代わりに「 cat 3306 longblock」を検索する人がよくいます。「longblock」が検索されたときに「long block」エンジンが表示されるようにする必要があります。

注: おそらくこの質問の目的には関係ありませんが、この Web サイトは PHP 5.3 とphpActiverecordを使用して構築されています。

4

3 に答える 3

3

また、mysqlの全文検索などの全文については、SphinxまたはLuceneを検討することをお勧めします。私はそれらを個人的に使用したことはありませんが、どちらもmysqlの組み込みフルテキストインデックスよりも優れていると聞いています。

これらすべてのメソッドで注意すべきことの1つは、更新を維持するために特別なインデックスが必要であり、これによりメンテナンスとサーバーのオーバーヘッドが増えることです。

スフィンクスに関する良い記事:http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

製品名や番号に適したメンテナンスなしのソリューションの場合、ユーザーの検索用語をスペースで分割し、それぞれにLIKE'%term%'をクエリに追加するだけです。

さらに、トークンがアルファベット順に並べられ、スペースと記号が削除された製品名または番号である特別な検索フィールドを作成します。製品名が変更されるたびに、このフィールドを更新する必要があります。次に、元のフィールドに対するクエリに加えて、ORこの新しい削除されたフィールドを検索します。たとえば、「cat 3306 longblock」のような製品名がある場合は、product_name_searchフィールドを作成し、「3306catlongblock」を配置します。ユーザーが検索するとき3306 long-block記号を削除してスペースを分割することにより、検索を処理します。

WHERE (other product name search clauses) OR 
    (product_name_search LIKE '%3306%' AND product_name_search LIKE '%longblock%')

このプロセスはフリーテキストほど良くはありませんが、製品名と番号にはかなりうまくいきます。

于 2013-03-19T17:47:10.897 に答える
3

どれだけシンプルにしたいかによって、いくつかのアプローチがあることをお勧めします。個人的には、ここに記載されている原則を使用して全文検索を使用しますhttp://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

ただし、正規表現を使用して検索語からスペースを取り除くこともできます。

$str=preg_replace('/\s+/', '', $str);
于 2013-03-19T16:30:41.610 に答える