【问题标题】:Best way to search into MySQL with artificial intelligence like google使用谷歌等人工智能搜索 MySQL 的最佳方法
【发布时间】:2014-05-26 18:00:56
【问题描述】:

我正在构建一个网络爬虫,它将爬取的结果收集到 MySQL 表中。

有五个主要列:URL, TITLE, DESCRIPTION, KEYWORDS, BODY

目前我正在使用MySQL的FULLTEXT搜索功能如下:

SELECT URL,title, description, MATCH (description, keywords, title, URL) AGAINST ('$keyword' in boolean mode) 
AS score FROM record
WHERE MATCH (description, keywords, title, URL) AGAINST ('$keyword' in boolean mode) order by score desc;";

但这并没有给我带来好的结果。考虑下图。

这里,Facebook 在搜索 "Facebook" 时排名第 23 位。(?)

我可以根据列名优先搜索吗?例如,我希望查询将最大优先级分配给URL,然后是description,然后是titlekeywords.. 最后是body

有什么建议吗?

【问题讨论】:

  • 根据您需要的条件,您不会从查询中得到您想要的。您需要使用一些 php 处理查询结果以赋予它们优先级。
  • 是的。你的观点是 100% 正确的。但是,如果我继续处理表中的每一条记录,系统就会变得非常慢。该表有数百万行。
  • 你不会返回所有行然后处理...像你一样运行查询,然后处理。
  • @cale_b 是的.. 我没想到。那很有帮助。谢谢。
  • 首先你需要考虑你的 MySQL 版本和存储引擎。您还需要研究用于全文搜索的 SQL 存储引擎的细微差别。一个很好的起点是:mysqlperformanceblog.com/2013/03/04/…。要真正在这方面取得任何进展,您至少需要了解 MyISAM 与 InnoDB for FTS。至于优先级,是的,你可以,但没有一种正确的方法可以做到这一点。这是一个学期的研究生课程(或两个。或五个)。简单的答案会有很多缺陷。

标签: php mysql search full-text-search


【解决方案1】:
SELECT URL,title, description, MATCH (description, keywords, title, URL) AGAINST ('$keyword' in boolean mode) AS score FROM record WHERE URL LIKE '%$keyword%' OR MATCH (description, keywords, title, URL) AGAINST ('$keyword' in boolean mode) order by score desc;";

只需使用 LIKE 运算符进行 URL 匹配。见上面的代码。谢谢你!

【讨论】:

    【解决方案2】:

    看看像 SoundEx 这样的东西:

    见:http://www.madirish.net/?article=85

    另外你能不考虑自己做权重吗:(我没有本地 MySQL,很抱歉半伪代码)

    SELECT 
        URL
        ,title
        , description
        , MATCH (URL) AGAINST ('$keyword' in boolean mode) AS urlscore 
        , MATCH (description) AGAINST ('$keyword' in boolean mode) AS descscore 
        , MATCH (title) AGAINST ('$keyword' in boolean mode) AS titlescore 
        , MATCH (body) AGAINST ('$keyword' in boolean mode) AS bodyscore 
    
        ,((MATCH (URL) AGAINST ('$keyword' in boolean mode))*4) 
        + ((MATCH (description) AGAINST ('$keyword' in boolean mode))*3) 
        + ((MATCH (title) AGAINST ('$keyword' in boolean mode))*2) 
        + ((MATCH (body) AGAINST ('$keyword' in boolean mode))*1)  as weightedscore
    FROM    
        record
    WHERE 
        MATCH (description, keywords, title, URL) AGAINST ('$keyword' in boolean mode) 
    order by 
        ((MATCH (URL) AGAINST ('$keyword' in boolean mode))*4) 
        + ((MATCH (description) AGAINST ('$keyword' in boolean mode))*3) 
        + ((MATCH (title) AGAINST ('$keyword' in boolean mode))*2) 
        + ((MATCH (body) AGAINST ('$keyword' in boolean mode))*1)  desc;";
    

    【讨论】:

    • 文章磁贴是“将 Soundex 与 MySQL 一起使用”,其中包含非常具体的文章。你还需要什么 - cael?
    • 感谢您的链接。这会很有帮助。 +1
    • 根据 stackoverflow 指南,仅链接的答案不是好的答案。来自how do I write a good answer 为链接提供上下文 - 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    • @AnthonyHorne 您需要here的答案,而不是其他网站。在这里总结主要技术点,并提供链接作为备份。不是相反
    • @Clivecale 在 Google/Bing 上搜索“SoundEx”会产生 140 万/150 万个结果,其中 40% 以上的前 10 个结果与 SQL 直接相关。如果这将有助于提出问题的人更接近他/她的答案,我不确定我是否看到了问题。我们不是想互相帮助吗?如果一年后链接不再存在,快速搜索将在 stackexchange 和其他地方找到更新的文章以提供帮助。上个月微软上就有文章与 SoundEx 的变化有关。我为什么要向人们指出旧的和不相关的文章。我一定没有明白这一点..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多