【问题标题】:search words without apostrophe (that have apostrophe)搜索没有撇号的词(有撇号)
【发布时间】:2012-01-31 15:16:31
【问题描述】:

我有一个疑问。在搜索中,人们搜索带有撇号的词的短语,搜索会显示结果,但如果人们搜索不带撇号的相同短语,则不会显示结果。

例子:

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

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

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

对不起我的英语。感谢您的帮助。

【问题讨论】:

标签: php mysql sql


【解决方案1】:

您可以尝试简单地从搜索查询中删除撇号。

如果你做:

$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};
}

当然,如果你能提供更多关于你当前代码的信息,那就太好了:) 你可以在这里粘贴你当前的脚本吗?

【讨论】:

    【解决方案2】:

    您可以尝试删除特殊字符,然后执行搜索(例如 str_replace 所有撇号不带任何内容,例如str_replace("'", "", $str)

    应该以搜索为目的来完成这项工作。

    【讨论】:

    • 感谢您的帮助,当单词没有撇号没有显示结果时,只放带撇号的结果,我可以应用str_replace但不会显示结果
    • 我有点难以理解你的英语,你能贴一些代码让我理解这个问题吗?
    • 我猜 OP 在数据库中的内容是 Smith's,如果他使用 smiths 作为搜索词,他想要一个结果。
    • 正如我所说,删除撇号等特殊符号可以解决问题。您也可以将字符串小写,但使用不区分大小写的搜索会增加大小写。
    • 我更新了我的帖子。当人们用 smiths(不带撇号)搜索时不显示结果,当人们用 smith's(带撇号)搜索时会显示结果。
    【解决方案3】:

    如果您在数据库中搜索,那么您应该考虑使用全文索引。

    假设是 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

    【讨论】:

    • 感谢您的回答。可能是一个解决方案,我会审查它,虽然这对我来说似乎有点难以理解。
    • 我输入:SELECT * FROM employees where match(lastName) against("smith" IN NATURAL LANGUAGE MODE) 并显示 1 个结果,SELECT * FROM employees where match(lastName) against( "smith's" IN NATURAL LANGUAGE MODE) 并显示 1 个结果,SELECT * FROM employees where match(lastName) against("smiths" IN NATURAL LANGUAGE MODE) 并且不显示结果(我需要显示 1 个结果)跨度>
    • 请阅读 MySQL 错误列表中的此条目 - bugs.mysql.com/bug.php?id=14194 并检查您运行的 MySQL >= 5.1.6
    • 如果您需要更多,那么您可能需要查看更复杂的搜索工具,例如 Sphinx - sphinxsearch.com
    • 感谢您的推荐。
    【解决方案4】:

    我不确定这是否是最好的方法,但我过去设置搜索的方法是在数据库中存储一个“词干”字段,其中包含您尝试搜索但已清理和词干的任何内容。

    为了清理我通过这个类传递数据,它所做的只是去除所有特殊字符,以及我不想在搜索中包含的特定单词列表:

    <?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%' 这样简单的东西可能就足够了。

    这意味着,例如,如果您搜索“daring”,它将源于“dar”,因此会产生与“dare”和“dares”相同的结果。

    可能没有很好地解释它,但希望这些信息足以让你开始 =)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多