我目前使用如下所示的 mysql 语句来搜索帖子标题。
select * from table where title like %search_term%
但问题是,如果标题是:Acme launches 5 pound burger
并且用户搜索了Acme
,它将返回一个结果。但如果用户搜索Acme burger
or Acme 5 pound
,它不会返回任何内容。
当用户搜索多个单词时,有没有办法让它返回结果?在这里使用正确LIKE
的东西还是可以使用其他东西?
要针对文本集合搜索字符串,请使用 MATCH() 和 AGAINST()
SELECT * FROM table WHERE MATCH(title) AGAINST('+Acme burger*')
或者为什么不 RLIKE
SELECT * FROM table WHERE TITLE RLIKE 'Acme|burger'
或 LIKE 搜索数组,以编译 $keys
$keys=array('Acme','burger','pound');
$mysql = array('0');
foreach($keys as $key){
$mysql[] = 'title LIKE %'.$key.'%'
}
SELECT * FROM table WHERE '.implode(" OR ", $mysql)
您可以使用 REGEXP 匹配搜索字符串中的任何单词:
select *
from tbl
where
title REGEXP CONCAT('[[:<:]](', REPLACE('Acme burger', ' ', '|'), ')[[:>:]]')
请注意,这不会非常有效。在这里看小提琴。
如果您需要匹配字符串中的每个单词,可以使用如下查询:
select *
from tbl
where
title REGEXP CONCAT('[[:<:]]', REPLACE('Acme burger', ' ', '[[:>:]].*[[:<:]]'), '[[:>:]]')
在这里拉小提琴。但是单词必须按正确的顺序排列(例如,'Acme burger' 会匹配,'burger Acme' 不会)。有一个 REGEXP 可以按任何顺序匹配每个单词,但 MySql 不支持它,除非您安装了支持 Perl regexp 的 UDF。
您需要做的是构造一个 SQL,例如:
select * from table where title like "%Acme%" and title like "%burger%"
简而言之:拆分字符串并like
为每个部分创建一个。它也可以用 替换空格%
,但我不确定。
最好的事情是通过基于空格拆分搜索字符串来执行联合操作,
对于 Acme 5 磅,
SELECT * FROM TABLE WHERE TITLE LIKE '%ACME 5 POUND%'
UNION
SELECT * FROM TABLE WHERE TITLE LIKE '%ACME%'
UNION
SELECT * FROM TABLE WHERE TITLE LIKE '%5%'
UNION
SELECT * FROM TABLE WHERE TITLE LIKE '%POUND%'
找出一种方法来优先考虑第一个查询。或者将上述一个作为具有一定优先级的四个单独的查询传递。我认为您正在使用前端 tp 传递查询到数据库,所以对您来说应该很容易。
<?php
$search_term = 'test1 test2 test3';
$keywords = explode(" ", preg_replace("/\s+/", " ", $search_term));
foreach($keywords as $keyword){
$wherelike[] = "title LIKE '%$keyword%' ";
}
$where = implode(" and ", $wherelike);
$query = "select * from table where $where";
echo $query;
//select * from table where title LIKE '%test1%' and title LIKE '%test2%' and title LIKE '%test3%'