搜索没有撇号的单词(有撇号)

时间:2012-01-31 15:16:32

标签: php mysql sql

我怀疑。在搜索中,人们使用带撇号的单词搜索短语并且搜索会显示结果,但如果人们搜索相同的短语而没有撇号则不显示结果。

示例:

搜索:史密斯的猫很漂亮 结果:1

搜索:史密斯猫非常漂亮 结果:0

换句话说,我需要当人们搜索“史密斯猫很漂亮”时,也会显示结果,我可以在SQL中进行此类搜索吗?

对不起我的英文。谢谢你的帮助。

4 个答案:

答案 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-search.html

特别是

  

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”相同的结果。

可能没有那么好解释,但希望有足够的信息让你开始=)