我有一个图书标题数据库,希望用户能够搜索标题而无需按照标题的确切顺序使用他们的搜索字词。使用查询数据库的表单
完成搜索例如:我希望他们能够通过要求" Pride Prejudice"来搜索傲慢和偏见。或者"偏见傲慢"而不是打字"骄傲和偏见"。
我尝试使用REGEXP并对搜索词进行爆炸,然后使用OR运算符(|)对它们进行内爆[给我所有内容的单词"和"在寻找骄傲和偏见时,(+)和(。*)无济于事。
答案 0 :(得分: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实现全文索引解决方案。
答案 1 :(得分: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}}';";
答案 2 :(得分:1)
我认为你不需要REGEXP。您可以尝试... WHERE title LIKE '%prejudice%' AND title LIKE '%pride%'
。
答案 3 :(得分:0)
通常在正常的正则表达式中,您只需执行(?=regA)(?=regB)
,但现在这在MySQL中不起作用。我对这个问题的解决方案是在MySQL语句中添加一个AND语句。虽然在自动生成时,在语义上不是一个很好的解决方案。
SELECT * FROM table WHERE column REGEXP 'regA' AND column REGEXP 'regB'
答案 4 :(得分:0)
匹配所有:
$keywords = $_POST['keywords'];
$keys = preg_replace('!\s+!', '|', $keywords);
$count = count(explode('|',$keys));
$regexp = "(($keys).*){{$count}}";
$query = "SELECT * FROM table WHERE column REGEXP '$regexp'";