现在我有一个功能可以搜索特定用户的所有帖子中的关键词(由用户指定),并返回所有关键词匹配的帖子。
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和无线电末端的空白字符将其抛弃有关,但它并没有似乎就是这种情况,因为我正在为收音机提供邮政令牌。
答案 0 :(得分:0)
我最终使用正则表达式来查找并用&#34;替换任何空格。 &#34;在字符串中,所以它会正确地标记。
$pregTokens = $pregText = preg_replace('/\s+/', ' ', $primaryResult['ent_posts_content']);
$postTokens = explode(' ', $pregTokens);