2011-07-25 1 views
3

私は書籍のデータベースを持っており、ユーザーはタイトルの正確な順序で検索語を使わなくても検索することができます。検索は、データベースに照会するフォームを使用して行われます。Regexpとmysql: "AND"演算子があります

例:「Pride Prejudice」または「Prejudice Pride」を入力する代わりに「Pride and Prejudice」と入力することで、Pride and Prejudiceを検索できます。

私はREGEXPを使って検索語を爆発させ、OR演算子(|)で爆縮してみました[誇りと偏見を捜すときは "and"という言葉ですべてを与えます]、(+)、(。*)から役立たず。

+6

全文検索私はInnoDBストレージエンジンを使用してい –

+0

を見てみましょう...それは働くだろうか? – autumn

+0

いいえ、そうではありません。あなたがSphinxなどをインストールすることができない限り、InnoDBの全文検索はありません。 – Mchl

答えて

1

ここではREGEXPは必要ありません。 ... WHERE title LIKE '%prejudice%' AND title LIKE '%pride%'のようなものを試すことができます。

4

高度な検索機能が必要な場合は、全文検索ソリューションを使用してください。

MySQLでは、組み込みのfulltext search index機能はMyISAMストレージエンジンでのみ機能します。 InnoDBはすべてのMySQLテーブルにとって望ましいストレージエンジンであるため、これは残念です。最近のMySQLのInnoDBは、ほとんどの場合MyISAMより高速で、MyISAMよりもクラッシュリカバリ機能が優れています。

MySQL開発チームから、InnoDB用のフルテキストインデックスを実装するつもりであるという声明があります。しかし、これが利用可能になってから何ヶ月か何年も離れていますし、確かにそれ以降のバージョンのMySQLにアップグレードする必要があります。

MyISAMフルテキストインデックスを使用する必要がある場合は、主にInnoDBにデータを格納し、検索可能なテキストのコピーをMyISAMテーブルに保存することをお勧めします。

Sphinx SearchまたはApache Solrのような外部ソリューションを使用して、データベースの全文検索機能を提供することもできます。 Sphinx Search index via the MySQL pluggable storage engine interfaceを使用する方法さえあります。

ワイルドカードでLIKEを、または全文検索でREGEXPを使用したがっていません。これらのソリューションでは、検索ごとにフル・テーブル・スキャンが発生し、データの量に応じて、インデックスを持っている場合よりも数百倍または数千倍も遅く実行されます。

私のプレゼンテーションでMySQL用の全文検索ソリューション「Practical Full-Text Search in MySQL」と私の書籍SQL Antipatterns: Avoiding the Pitfalls of Database Programmingの章で比較しました。


アップデート:MySQL 5.6は現在開発中であり(2012年2月現在)、InnoDBのフルテキストインデックスソリューションを実装しています。

+0

+1私は数か月前に別の情報源からあなたの「実用的なフルテキスト検索in MySQL」を見つけました。検索最適化のための優れた情報源! –

0

通常、正規表現では(?=regA)(?=regB)を実行しますが、これは現在MySQLでは機能しません。この問題に対する私の解決策は、MySQLステートメントにANDステートメントを追加することでした。自動的に生成された場合、意味的にはあなたの場合には素晴らしい解決策ではありません。

SELECT * FROM table WHERE column REGEXP 'regA' AND column REGEXP 'regB' 
3

これは、あなたが探して何をする必要があります:

$search_terms = trim($_GET['search']); 
$search_terms = explode(" ",$search_terms); 
$match_size = sizeof($search_terms); 
$search = ""; 

for ($x=0;$x<$match_size$x++){ 
if($x>0) 
    $search = $search."|".$search_terms[$x]; 
else 
    $search = trim($search_terms[$x]); 
} 

select * from TABLE where FIELD regexp '(($search).*){{$match_size}}';"; 
0

すべてを一致させるには:

$keywords = $_POST['keywords']; 
$keys = preg_replace('!\s+!', '|', $keywords); 
$count = count(explode('|',$keys)); 
$regexp = "(($keys).*){{$count}}"; 
$query = "SELECT * FROM table WHERE column REGEXP '$regexp'"; 
関連する問題