【问题标题】:Best way to get more accurate results in MySQL在 MySQL 中获得更准确结果的最佳方法
【发布时间】:2020-03-18 17:53:44
【问题描述】:

我在开发环境方面面临两难境地。这是一个三表结构:

  1. 表格内容(文章、新闻...)
  2. 表格标签(每篇文章和新闻记录的标签)
  3. 表格跳过单词(诸如“for”、“get”、“to”之类的单词...)

主要思想是根据文本搜索获取内容记录,如何?

首先,根据Skip Words表从文本搜索中删除单词,然后将其余单词与tags表匹配。但是,我想给出一个“更智能”的结果,作为

第二步,我想首先得到与文本搜索的所有剩余单词匹配的文章。这些记录将是主要的印刷品。

第三步,如果没有与文本搜索的所有单词匹配的记录,则开始寻找匹配较少单词的记录并保持计数,依此类推,直到我得到内容记录列表。

最后步骤显示根据单词匹配量排序的记录。所以,考虑到这个过程,我想使用:

  1. 用于从上述所有步骤加载数据的临时表
  2. 使用单个存储过程和所需的所有逻辑

上面比较标签,使用“Like”条件and field like "word1%" and field like "word2%"

但是,我关心的是性能。这将是主页网站中的一个过程,该网站每小时访问量超过 1700 次。我很感激你能解释你对这种过程的经验(如果有的话)?或者您认为考虑性能的最佳实施方式是什么?

【问题讨论】:

  • 一天访问 1000 次不算什么,等到一分钟访问量达到 1000 次再担心
  • 在模式末尾使用通配符应该没问题。如果它是在模式的开头,那将是一个问题。确保搜索列已编入索引。
  • 对不起,我编辑了。该网站每小时获得(平均)1700 次访问!

标签: mysql performance search procedure temporary


【解决方案1】:

使用FULLTEXT 索引。它涵盖了您试图重新发明的一些想法。 1700/hr 没问题。

WHERE MATCH(col) AGAINST('join*' IN BOOLEAN MODE)

匹配 join/join/joined 和join。

【讨论】:

  • 其实 FULLTEXT 索引越过我的想法,但根据我的研究,这个索引允许使用通配符,但问题是,例如,如果我看 'join*',它会找到记录包括“joins”、“joining”等词。但我需要反过来,我需要一个标签“joi”,所以它可以用来做 LIKE -> where “joins” like concat(tag, "%")
  • @Andino - 我添加了"join*" in boolean mode的示例
  • 感谢@RickJames 的示例。但我需要的恰恰相反。例如,如果用户键入“加入”,我需要将其与列进行比较。在索引列中,我们只会在文本中找到“joi”。那么,有没有我可以使用的方法,例如 MATCH(col) 但使用通配符,如MATCH(concat(col,"*")) 或类似的想法?这是因为查找“join”的所有组合并将它们添加到具有 FULLTEXT 索引的列中对我来说不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多