【问题标题】:FULLTEXT Search Multiple Columns in MySQL?FULLTEXT 在 MySQL 中搜索多个列?
【发布时间】:2020-09-08 19:18:07
【问题描述】:

所以过去几天我一直在努力解决这个问题。我有音乐流派。由主要和次要列分开。摇滚/前卫摇滚等。我有它,所以它会搜索一列,很好。但我希望它搜索任一列。在谷歌上搜索帮助。我发现理论上 FULLTEXT 搜索应该做到这一点。我在主列和辅助列上都设置了 FULLTEXT 索引。但我无法让它工作。

这是我适用于单列的代码:

    $query = sprintf("SELECT * FROM musicgenres WHERE secondary LIKE '%%%s%%' LIMIT 20", mysql_real_escape_string($_GET["q"]));

$arr = array();
$rs = mysql_query($query);

while($obj = mysql_fetch_object($rs)) {
    $arr[] = $obj;
}

$json_response = json_encode($arr);

if($_GET["callback"]) {
    $json_response = $_GET["callback"] . "(" . $json_response . ")";
}


$final = str_replace(genre_id, id, $json_response);
echo $final;

(它以 JSON 格式返回结果)

我尝试按照这个教程进行操作,我发现它以这个为例:

 $term = "Search Term";

    $sql = "SELECT *, MATCH(title, content) AGAINST('". $term ."') as score FROM pages WHERE MATCH (title, content) AGAINST('". $term ."') ORDER BY score DESC";
    $query = mysql_query($sql);

问题似乎在 SELECT 查询中。或者当我把它结合起来的时候。这会导致此行出错:

while($obj = mysql_fetch_object($rs)) {

我最近尝试的 Select 查询是:

$term = mysql_real_escape_string($_GET["q"]);

$sql = "SELECT *, MATCH(primary, secondary) AGAINST('". $term ."') as score FROM musicgenres WHERE MATCH (primary, secondary) AGAINST('". $term ."') ORDER BY score DESC";

我也尝试过:LIKE '%%%s%%'(这会更有用。因为部分匹配会很好)

【问题讨论】:

  • 它返回什么错误?像在phpmyadmin中一样直接在mysql上尝试查询,尝试使用mysql_fetch_array
  • 错误:警告:mysql_fetch_object():提供的参数不是第 29 行 C:\Web Pages\PHP\GenreTest.php 中的有效 MySQL 结果资源 []
  • 第 29 行:while($obj = mysql_fetch_object($rs)) {
  • 直接在 mysql 上尝试查询,如在 phpmyadmin 中直接在 mysql 上尝试查询,如在 phpmyadmin 中,它返回什么?试试这样的SELECT *, MATCH(title, content) AGAINST('". $term ."') FROM pages
  • 我没有意识到我可以尝试一下.. 让我检查一下.. 等一下。

标签: php mysql full-text-search


【解决方案1】:

我不能 100% 确定您在寻找什么,但如果您想搜索多个列,这样的东西应该可以工作:

"SELECT * FROM musicgenres WHERE secondary LIKE '%%%s%%' OR primary LIKE '%%%s%%' LIMIT 20"

希望这与您正在寻找的内容相近。

【讨论】:

  • 我也试过好几次了。它会导致解析错误:解析错误,在 C:\Web Pages\PHP\GenreTest.php 中期待 T_STRING' or T_VARIABLE' 或 `T_NUM_STRING'第 30 行 - 将其转换为 JSON 响应的一部分,以便我的页面可以使用它的数据。
【解决方案2】:

好的,试试这个查询

SELECT column1, column2, ..., MATCH(primary, secondary) AGAINST('". $term ."') as score 
FROM musicgenres 
WHERE MATCH (primary, secondary) AGAINST('". $term ."') 
ORDER BY score DESC"

如果它不起作用,请尝试从 select 子句中删除 match() against()

SELECT column1, column2, ... FROM .... 

【讨论】:

    【解决方案3】:

    也许您想添加包含要搜索的列的索引:

    ALTER TABLE `table` 
    ADD FULLTEXT `fulltext_idxAll` (`column1`, `column2`,`column3`);
    
    SELECT * FROM `table` 
    WHERE MATCH (`column1`, `column2`,`column3`) 
    AGAINST ('whateveryouwanttosearch')
    

    希望这对你有用。

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2019-02-07
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多