使用带有空格的levenshtein进行全文搜索

时间:2014-05-05 13:33:32

标签: php search levenshtein-distance

现在我有一个功能可以搜索特定用户的所有帖子中的关键词(由用户指定),并返回所有关键词匹配的帖子。

public function fullTextSearch($text, $userId, $offset = 0, $limit = 0) {
    $tokens = explode(' ', trim($text,' '));
    $requiredMatches = count($tokens);
    $matchingId = array();
    $result = false;

    $sql = "SELECT posts.content "
            . "FROM  posts "
            . "WHERE posts.user_id = '" . $userId . "'";
    $primaryResults = $db->fetchAll($sql);

    foreach ($primaryResults as $primaryResult) { //results from query
        $postTokens = explode(' ', $primaryResult['ent_posts_content']);
        $foundMatches = 0;
        foreach ($tokens as $token) { //each of the required words

            foreach ($postTokens as $postToken) { //each of the words in the post


                $distance = levenshtein(strtolower($token), strtolower(rtrim($postToken)));

                if ($distance < 2) {
                    $foundMatches++;
                }
            }
            if ($foundMatches >= $requiredMatches) {
                $matchingId[] = $primaryResult['id'];
            }
        }
    }

我遇到的问题是,我的一位用户喜欢标题他的帖子,并通过他的临时“标题”搜索这些帖子,例如;

  

我的电台

     

播放所有音乐

正如您在代码中看到的那样,我从帖子的内容中删除了令牌以尝试避免此问题。但是当我在提供的代码中搜索Radio时,我没有得到那个帖子,我认为这与使用levenshtein和无线电末端的空白字符将其抛弃有关,但它并没有似乎就是这种情况,因为我正在为收音机提供邮政令牌。

1 个答案:

答案 0 :(得分:0)

我最终使用正则表达式来查找并用&#34;替换任何空格。 &#34;在字符串中,所以它会正确地标记。

        $pregTokens = $pregText = preg_replace('/\s+/', ' ', $primaryResult['ent_posts_content']);
        $postTokens = explode(' ', $pregTokens);