【问题标题】:Ranking search results by counting words related via PDO/SQL通过计算通过 PDO/SQL 相关的单词对搜索结果进行排名
【发布时间】:2017-03-09 16:31:43
【问题描述】:

我想创建一个通过预设排名显示结果的搜索引擎。评分由两部分组成 1. 帖子浏览量(用“post”表中的POP [INT]表示)和文本本身的字数(用“post”表中的TXT [STRING]表示)。

也就是说如果有三个结果

//$search = 'apple macbook';
  1. 3 个匹配项 (POP) 和 3 个相关关键字(2 个 MACBOOK,1 个在 TXT 中找到的 APPLE)= 6 - 将首先显示
  2. 2 个点击 (POP) 和 3 个相关关键字(1 个 MACBOOK,1 个 APPLE 在 TXT 中找到)= 5 - 将显示 第二个
  3. 2 个点击 (POP) 和 1 个关键字相关(在 TXT 中找到 1 个 APPLE)= 3 - 将显示 第三个​​

我的代码:

$search = isset($_GET['s']) ? htmlspecialchars($_GET['s']) : ''; 
$search = strtoupper($search);
$search = strip_tags($search); 
$search = trim($search);
$words = explode(' ', $search);
$words_condition = array();
$arguments = array();
foreach ($words as $word) {
    $words_condition[] = 'TXT LIKE ?';
    $arguments[] = '%'.$word.'%';
}

    $query = $db->prepare("SELECT * FROM `post` WHERE ".implode(" OR ",
    $words_condition)." ORDER BY POP DESC"); $query->execute($arguments);

关于我的表结构(“post”表)有 4 列...

  1. ID [INT] 2. SUB(帖子主题)[STRING] 3. TXT(正文/全文)[STRING] 4. POP [INT](访问此帖子的点击次数)。

【问题讨论】:

  • 你能给我们你的表结构吗?
  • 您没有以正确的方式使用准备好的语句。通过简单地连接搜索词,您仍然容易受到 sql 注入的攻击
  • @Philipp 感谢您的评论。关于我的表结构(“post”表)有 4 列... 1. ID [INT] 2. SUB(帖子的主题) [STRING] 3. TXT(正文/全文)[STRING] 4. POP [INT](访问此帖子的点击次数)。
  • @philipp 有什么想法吗?

标签: php mysql search pdo keyword


【解决方案1】:
CREATE TABLE post (id INT, txt varchar(100), pop int);
INSERT INTO post VALUES (1, "key key cle cle", 1);
INSERT INTO post VALUES (2, "key key cle cle", 2);
INSERT INTO post VALUES (3, "key key cle", 2);
INSERT INTO post VALUES (4, "key cle cle", 1);

SELECT *, (LENGTH(txt) - LENGTH(replace(txt, 'cle', '')))/LENGTH("cle") as cle, 
    (LENGTH(txt) - LENGTH(replace(txt, 'key', '')))/LENGTH("key") as key,
    (LENGTH(txt) - LENGTH(replace(txt, 'cle', '')))/LENGTH("cle")+(LENGTH(txt) - LENGTH(replace(txt, 'key', '')))/LENGTH("key") as nbKW
FROM post 
ORDER BY nbKW DESC, pop DESC;

好的,我对其进行了测试,效果非常好!你必须根据你的论点来调整它!

【讨论】:

  • 嗨..感谢您的新回答...这是两个主要问题... 1.如果有人搜索 5 个或无限字会发生什么?您的查询仅适用于 2 个单词。 2. sql注入(通过GET方式来自搜索引擎)TIA呢
  • 你必须适应它,用你的 foreach($word) 完成查询的“选择部分”。
  • 但是怎么做呢?我不明白
  • 对于每个关键字,您在选择部分添加 (LENGTH(txt) - LENGTH(replace(txt, 'keyword[x]', '')))/LENGTH("'keyword[x ]") 作为'关键字[x],
  • 对于 nbKW,(LENGTH(txt) - LENGTH(replace(txt, 'keyword[x]', '')))/LENGTH("keyword[x]") + (LENGTH( txt) - LENGTH(replace(txt, 'keyword[x+1]', '')))/LENGTH("keyword[x+1]") + .....
猜你喜欢
  • 2011-06-24
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多