【问题标题】:Search results are limited, no good results return when searching for more than one word搜索结果有限,搜索多个单词时没有返回好结果
【发布时间】:2023-03-12 03:04:01
【问题描述】:

为了便于理解:在“result”表中有一个名为“result_search”的列。其中一行是例如:“word letter sentence”。

如果我搜索这些词中的任何一个,或者即使我搜索“word letter”或“letter sentence”,我的搜索效果也很好,但是当我将它们混合起来并搜索“sentence word”或“letter word”时,没有结果显示出来了。

我该如何解决这个问题?我假设我需要告诉搜索引擎自己搜索每个单词并只返回两个单词都存在的结果,但必须像它们在表格中一样彼此相邻?! 这是我所拥有的:

<form action="search.php" method="GET">
    <input type="text" name="query" />
    <input type="submit" value="Search" />
</form>


<?php
    $query = $_GET['query'];          
    $min_length = 3;         
    if(strlen($query) >= $min_length){ 

        $query = htmlspecialchars($query);             
        $query = mysql_real_escape_string($query);

        $raw_results = mysql_query("SELECT * FROM result WHERE (`result_search` LIKE '%".$query."%')") or die(mysql_error());               

        if(mysql_num_rows($raw_results) > 0){ 

            while($results = mysql_fetch_array($raw_results)){                 
                echo "<p><h3>".$results['result_search']."</h3></p>";
            }

        }
        else{
            echo "No results";
        }

    }
    else{ 
        echo "Minimum length is ".$min_length;
    }
?>

感谢您的帮助!

【问题讨论】:

  • 您可以按空格分割关键字,然后使用 OR 搜索所有可能的单个单词
  • 不错的选项概述...slideshare.net/billkarwin/…
  • 请熟悉 LIKE 运算符的工作原理……

标签: php mysql search


【解决方案1】:
$raw_results = mysql_query("SELECT * FROM result WHERE (`result_search` REGEXP '(".preg_replace('/\s+/', '|', $query).")')") or die(mysql_error());

preg_replace('/\s+/', '|', $query) 将空格替换为 | 以搜索 OR 条件中的每个单词。

结果查询将是

SELECT * FROM result WHERE (`result_search` REGEXP '(word|letter)')

查询结果将是每个包含“word”或“better”的racord

要获取包含两个字符串 REGEX 的记录,因为使用 (?=.*AND 条件出现“重复操作符操作数无效”错误而无法使用

$sql = "SELECT * FROM result WHERE 1";
$matches = preg_split('/\s+/',$query);
foreach($matches as $match){
$sql .= " AND `result_search` LIKE '%".$match."%'";
}
$raw_results = mysql_query($sql) or die(mysql_error());

$matches = preg_split('/\s+/',$query); 在找到空格的地方拆分。

【讨论】:

  • 您能否解释一下这样做的目的,而不是仅仅发布一行代码?尤其是在使用正则表达式时,这并不是微不足道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多