【问题标题】:Multiple term search query多词搜索查询
【发布时间】:2012-11-24 16:54:43
【问题描述】:

我有一个爬虫,它可以扫描网页中的所有单词。然后它将每个单词连同它所属的 url 一起插入到 mysql 数据库中。然后按照在文档中找到的单词数量对搜索进行排名。问题是...如何将多个术语查询添加到现有查询中。

它非常适合单词查询,但我希望我的查询尝试在同一个网页中一起查找单词,如果网页中没有出现任何单词,则正常返回这些词的结果。

我的查询如下:

         $results = addslashes( $_POST['results'] );

               " SELECT p.page_url AS url,
                       COUNT(*) AS occurrences 
                       FROM page p, word w, occurrence o
                       WHERE p.page_id = o.page_id AND
                       w.word_id = o.word_id AND
                       w.word_word = \"$keyword\"
                       GROUP BY p.page_id
                       ORDER BY occurrences DESC
                       LIMIT $results"

【问题讨论】:

    标签: php sql


    【解决方案1】:

    使用COUNT(DISTINCT ...) 计算在每个页面上找到的不同单词的数量,并使用IN 查找单词列表中的任何一个:

    SELECT
        p.page_url AS url,
        COUNT(DISTINCT w.word_word) AS words_found
        COUNT(*) AS occurrences 
    FROM page p
    JOIN occurrence o ON p.page_id = o.page_id
    JOIN word w ON w.word_id = o.word_id
    WHERE w.word_word IN ('foo', 'bar')
    GROUP BY p.page_id
    ORDER BY occurrences DESC
    

    如果要确保页面上至少有 n 个搜索词,请添加 HAVING 子句:

    GROUP BY p.page_id
    HAVING COUNT(DISTINCT w.word_word) >= 2
    ORDER BY occurrences DESC
    

    【讨论】:

    • 我应该把“foo”和“bar”放在哪里?
    • @user1840291:这取决于您要搜索的单词。你能举一个具体的例子说明你的用户可能在搜索什么吗?
    • @user1840291:你能举个现实的例子吗?发挥你的想象力......
    【解决方案2】:

    如果数据库引擎支持,您可以进行子选择。示例:

    SELECT 
      url, 
      (select count(*) from table where conditions1) as count1, 
      (select count(*) from table where conditions2) as count2 
     FROM table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2014-07-11
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多