【问题标题】:Regexp and mysql: is there an "AND" operator正则表达式和mysql:是否有“AND”运算符
【发布时间】:2011-07-25 17:43:12
【问题描述】:

我有一个书名数据库,并希望用户能够搜索书名,而不必按照书名的确切顺序使用他们的搜索词。使用查询数据库的表单完成搜索

例如:我希望他们能够通过询问“Pride Prejudice”或“Prejudice Pride”来搜索“傲慢与偏见”,而不是输入“傲慢与偏见”。

我尝试使用 REGEXP 并分解搜索词,然后使用 OR 运算符 (|) 将它们分解 [在搜索傲慢与偏见时,我会用“and”这个词给我所有内容],(+) 和 (.*) 为 no有用。

【问题讨论】:

  • 看看全文搜索
  • 我正在使用一个 innodb 存储引擎...这行得通吗?
  • 不,不会。没有全文搜索 InnoDB - 除非你可以安装 Sphinx 或类似的。

标签: mysql regex full-text-search


【解决方案1】:

如果您需要复杂的搜索功能,请使用全文搜索解决方案。

在 MySQL 中,内置的 fulltext search index 功能仅适用于 MyISAM 存储引擎。这是不幸的,因为 InnoDB 是所有 MySQL 表的首选存储引擎。在大多数情况下,最新版本的 MySQL 中的 InnoDB 比 MyISAM 更快,并且具有比 MyISAM 更好的崩溃恢复功能。

MySQL 开发团队曾声明他们打算为 InnoDB 实现全文索引。但是我们距离这个版本还有好几个月甚至几年的时间,而且肯定需要升级到更高版本的 MySQL。

如果您必须使用 MyISAM 全文索引,我建议您将数据主要存储在 InnoDB 中,然后将可搜索文本的副本存储在 MyISAM 表中。

您还可以使用Sphinx SearchApache Solr 等外部解决方案在数据库外部提供全文搜索功能。甚至还有一种方法可以使用Sphinx Search index via the MySQL pluggable storage engine interface

我不喜欢使用带有通配符的LIKEREGEXP 进行全文搜索。这些解决方案在每次搜索时都会进行全表扫描,并且根据您的数据量,运行速度比有索引时慢数百或数千倍。

我在我的演示文稿“Practical Full-Text Search in MySQL”和我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming 的一章中写了一个 MySQL 全文搜索解决方案的比较。


更新:MySQL 5.6 目前正在开发中(截至 2012 年 2 月),并为 InnoDB 实现了全文索引解决方案。

【讨论】:

  • +1 几个月前,我从另一个来源看到了您的“MySQL 中的实用全文搜索”。搜索优化的绝佳信息来源!
【解决方案2】:

这应该是你要找的:

$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}}';";

【讨论】:

    【解决方案3】:

    我认为您在这里不需要 REGEXP。你可以试试... WHERE title LIKE '%prejudice%' AND title LIKE '%pride%'

    【讨论】:

      【解决方案4】:

      通常在普通的正则表达式中你会做(?=regA)(?=regB),但现在这在 MySQL 中不起作用。我对这个问题的解决方案是在 MySQL 语句中添加一个 AND 语句。虽然在自动生成时,在您的情况下语义上不是一个好的解决方案。

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

      【讨论】:

        【解决方案5】:

        匹配所有:

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

        【讨论】:

          猜你喜欢
          • 2010-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-07
          相关资源
          最近更新 更多