我怀疑。在搜索中,人们使用带撇号的单词搜索短语并且搜索会显示结果,但如果人们搜索相同的短语而没有撇号则不显示结果。
示例:
搜索:史密斯的猫很漂亮 结果:1
搜索:史密斯猫非常漂亮 结果:0
换句话说,我需要当人们搜索“史密斯猫很漂亮”时,也会显示结果,我可以在SQL中进行此类搜索吗?
对不起我的英文。谢谢你的帮助。
答案 0 :(得分:2)
您可以尝试从搜索查询中删除撇号。
如果你做:
$search_query = str_replace("'", '', $search_query);
然后脚本的其余部分可能看起来像这样:
$words = explode(' ', $search_query);
foreach($words as $word)
{
$pos = strpos($text_to_search, $word);
if(is_int($pos))
echo 'found word {$word} at position {$pos};
}
当然,如果您可以提供有关当前代码的更多信息,那就太好了:)您是否可以将当前脚本粘贴到此处?
答案 1 :(得分:1)
您可以尝试剪切特殊字符,然后执行搜索(例如str_replace所有的撇号,例如str_replace("'", "", $str)
)
为了搜索的目的,应该做的工作就是。
答案 2 :(得分:1)
如果您在数据库中搜索,则应考虑使用全文索引。
假设MySQL,请阅读
特别是
http://dev.mysql.com/doc/refman/5.6/en/fulltext-natural-language.html
答案 3 :(得分:0)
我不确定这是否是最好的方法,但我过去设置搜索的方式是在数据库中存储一个“stemmed”字段,其中包含您尝试搜索但已清理和阻止的内容。< / p>
要清理我通过这个类传递数据,它只会删除任何特殊字符,以及我不想在搜索中包含的特定单词列表:
<?php
class Cleaner {
var $stopwords = array(" find ", " about ", " me ", " ever ", " each ", " update ", " delete ", " add ", " insert ", " where ", " i ", " a ", " my ");//you need to extend this big time.
var $symbols = array('/','\\','\'','"',',','.','<','>','?',';',':','[',']','{','}','|','=','+','-','_',')','(','*','&','^','%','$','#','@','!','~','`');
function parseString($string) {
$string = ' '.$string.' ';
$string = $this->removeStopwords($string);
$string = $this->removeSymbols($string);
return $string;
}
function removeStopwords($string) {
for ($i = 0; $i < sizeof($this->stopwords); $i++) {
$string = str_replace($this->stopwords[$i],' ',$string);
}
//$string = str_replace(' ',' ',$string);
return trim($string);
}
function removeSymbols($string) {
for ($i = 0; $i < sizeof($this->symbols); $i++) {
$string = str_replace($this->symbols[$i],' ',$string);
}
return trim($string);
}
}
然后我使用an implementation of the porter stemmer algorithm来阻止这些词。
然后在搜索时,您需要阻止搜索词并与数据库中清理/词干的列表进行比较。像SELECT * FROM search WHERE keyword LIKE '%$stem%'
这样简单的东西就足够了。
这意味着,例如,如果你搜索“大胆”,它将会产生“dar”,因此会产生与“dare”和“dare”相同的结果。
可能没有那么好解释,但希望有足够的信息让你开始=)