2010-05-01 138 views
1

,如果用户输入'good',它会显示所有包含关键字'good'的结果。然而,如果用户输入“最好的最甜蜜”,则它不显示结果,因为没有两个词汇一起出现的记录;但出现在不同地方的入口处。在我的搜索表单中显示多个单词的搜索结果

例如,记录说:

一个很好的动作是一个不断剩余 店和纯产在“好”,它会显示这个

用户类型记录,但如果用户输入“好”+“纯”,则不会显示任何内容。或者如果记录中包含关键字“善行”,并且用户在没有连字符的情况下输入“好行为”,则不会显示任何内容。

我想要的是,如果用户输入'好'+'纯'或'好行为',则应该包含这些关键字的记录突出显示它们。

的search.php代码:

$search_result = ""; 

$search_result = $_POST["q"]; 

$search_result = trim($search_result); 

//Check if the string is empty 
if ($search_result == "") { 
    echo "<p class='error'>Search Error. Please Enter Your Search Query.</p>" ; 
    exit(); 
     } 

if ($search_result == "%" || $search_result == "_" || $search_result == "+") { 
    echo "<p class='error1'>Search Error. Please Enter a Valid Search Query.</p>" ; 
    exit(); 
     } 

$result = mysql_query('SELECT cQuotes, vAuthor, cArabic, vReference FROM thquotes WHERE cQuotes LIKE "%' . mysql_real_escape_string($search_result) .'%" ORDER BY idQuotes DESC', $conn) 
    or die ('Error: '.mysql_error()); 


function h($s) { 
    echo htmlspecialchars($s, ENT_QUOTES); 
} 

function highlightWords($string, $word) 
{ 

    $string = preg_replace("/".preg_quote($word, "/")."/i", "<span class='highlight'>$0</span>", $string); 
    /*** return the highlighted string ***/ 
    return $string; 

} 

?> 

<div class="caption">Search Results</div> 
<div class="center_div"> 
<table> 
    <?php while ($row= mysql_fetch_array($result, MYSQL_ASSOC)) { 
     $cQuote = highlightWords(htmlspecialchars($row['cQuotes']), $search_result); 
     ?> 
     <tr> 
     <td style="text-align:right; font-size:18px;"><?php h($row['cArabic']); ?></td> 
      <td style="font-size:16px;"><?php echo $cQuote; ?></td> 
      <td style="font-size:12px;"><?php h($row['vAuthor']); ?></td> 
      <td style="font-size:12px; font-style:italic; text-align:right;"><?php h($row['vReference']); ?></td> 
     </tr> 
    <?php } ?> 
</table> 
</div> 

search.html:

<form name="myform" class="wrapper"> 
     <input type="text" name="q" onkeyup="showUser()" class="txt_search"/> 
     <input type="button" name="button" onclick="showUser()" class="button"/> 
     <p> 
     <div id="txtHint"></div> 
    </form> 

回答

2

你想要什么叫full-text searching。简而言之,全文搜索基本上是单独搜索每个单词。

+0

我的表类型是INNODB。 。不幸的是它说它不支持FULLTEXT。 – input 2010-05-01 20:58:51

+0

在这种情况下,我建议你去看看http://stackoverflow.com/questions/1381186/fulltext-search-with-innodb,它完全处理如何解决这个问题。如果一个专门的搜索引擎(就像那篇文章中提到的那样)对你来说是不可能的,你可以做其他事情,比如使用触发器将你的InnoDB数据复制到MyISAM表并在该表上搜索,或者手动滚动你自己的解决方案分裂的内容和链接到正确的职位,如加布里埃尔建议。 – 2010-05-01 21:14:11

+0

谢谢你的回答。决定继续使用php替代品。 http://www.acuras.co.uk/articles/2-php-multi-word-mysql-search-algorithm-and-output – input 2010-05-03 10:48:22

1

你会想要实现内容索引来利用这种搜索,实质上是一个关联表,它将每个单词与一个内容组件(如你的记录)关联起来,当你搜索查询索引并返回关联的内容时,允许你通过计数来改变相关性,添加要索引的字段等。http://www.databasejournal.com/sqletc/article.php/1578331/Using-Fulltext-Indexes-in-MySQL---Part-1.htm这可能是一个好的开始。

+0

请参阅我上面的评论。我的表类型是INNODB。有没有解决这个在INNODB中使用FULLTEXT的方法? – input 2010-05-01 21:01:41

+0

从我可以看到它出现大多数用户正在创建一个辅助ISAM表来处理这个问题,我只能通过读取INNODB中的内容并在ISAM中创建索引记录来执行搜索,并且不返回结果,但通过键向INNODB查询。 – Gabriel 2010-05-01 21:23:29

0

在我看来,正确地为您的网站做一个搜索引擎是最难的事情之一。我只想在谷歌上登录我的网站,并让谷歌索引它。您可以自定义页面的输出并将该外观整合到您的网站中。

唯一的证据将是“谷歌”品牌的搜索按钮,但说实话,我认为你现在可以删除它。