【发布时间】:2012-02-26 18:35:38
【问题描述】:
我正在尝试进行基本的反向完整测试搜索,但不知道最好的方法。
基本上,我有一个关键短语表,如下所示:
id - 短语
1 - “你好世界”
2 - “再见世界”
3 - “这是我的世界”
然后我有一个设置字符串,例如“欢迎来到 hello world 组”。我想在我的表中找到与短语完全匹配的所有行的 ID。意思是“o the”将不匹配,因为这个词是“to the”。 “hello”也不匹配,因为世界是“hello”。
使用全文搜索,这可以通过搜索以下内容轻松实现:
反对 ('"hello world"' 在布尔模式);
问题是,我不相信我可以使用全文搜索,因为全文搜索会找到包含单个短语的所有行。我想要与单个集合匹配的所有短语(来自一组已知的短语)。
我知道如何使用 RegEx 使用以下方法来执行此操作,但是这会变慢。在有 400,000 个关键短语的表格上,它花费了 40 多秒:
WHERE “我知道我想搜索的数据放在这里” REGEXP CONCAT('[[:<:>phrases, '[[:>:]]')
我需要的是一种更优化的方式来做到这一点。即使我必须暂时将其添加到表中而不实际单独检查每个关键字,我如何才能将其作为全文搜索进行。
我非常感谢您的反馈,因为这确实导致我的网站在添加新数据方面滞后。
【问题讨论】:
-
致任何有类似问题的人:尽管我最终测试了一个理论。我所做的是在我的关键字表中添加一列并将其设置为关键字,按单词分割,然后加入 |,确保它以 | 开头和结尾。所以“hello my world”变成了“|hello|my|world|”。从那里,当一个新的字符串进来时,我做了同样的事情,所以“让我们测试你好我的世界”变成了“|lets|test|hello|my|world|”。有了这个,我可以很容易地找到我的世界,因为它有开始和结束|确保“shello my world”不匹配。
-
这将包含约 400,000 个关键短语的 50 秒查询缩短到约 1.2 秒。仍然很慢,但足以让我的应用程序继续运行。为了更好地优化这一点,我最终可能会按照 Jogo 的建议进行搜索层,但这对于现在来说已经足够了,因为这会导致所有停机时间
标签: mysql full-text-search where-clause