【问题标题】:FULLTEXT search - Index not firing on OR searches, but it is on AND searchesFULLTEXT 搜索 - 索引未在 OR 搜索中触发,但在 AND 搜索中
【发布时间】:2014-06-26 10:58:02
【问题描述】:

好的,很抱歉这个奇怪的标题,但我认为它涵盖了它。

我正在尝试提高我的简历搜索数据库的性能。 30,000 条记录并且还在增长,我们看到了一些性能问题。

我创建了一个减慢速度的字段索引,这是他们简历的正文(所有重复词和停用词都已删除)。

我为该字段创建了一个全文索引,它在像“DRILLER”这样的单字查询或像“DRILLER AND PAINTER”这样的两个单词查询上效果很好。我可以在 EXPLAIN 中看到索引正在触发,一切都很快 - 快乐的日子。

我的问题。当我执行搜索说“DRILLER OR CLEANER”时,索引不会触发,查询时间拖到 6 秒左右。我的 SQL 查询;

FAST - 使用索引

SELECT nl_id FROM CV 
 WHERE (  ( MATCH (nl_striptext) AGAINST ('driller' IN BOOLEAN MODE)
       AND  MATCH (nl_striptext) AGAINST ('cleaner' IN BOOLEAN MODE) ) )

SLOW - 索引未触发

SELECT nl_id FROM CV
 WHERE (    ( MATCH (nl_striptext) AGAINST ('driller' IN BOOLEAN MODE)
         OR   MATCH (nl_striptext) AGAINST ('cleaner' IN BOOLEAN MODE) ) )
 LIMIT 15 OFFSET 0

我在这里摸不着头脑,非常感谢您的帮助。

【问题讨论】:

标签: mysql sql indexing full-text-search


【解决方案1】:

OR 可能会导致查询优化出现问题。您可以通过将查询编写为来解决此问题:

(SELECT nl_id
 FROM CV
 WHERE MATCH (nl_striptext) AGAINST ('driller' IN BOOLEAN MODE)
) UNION
(SELECT nl_id
 FROM CV
 WHERE MATCH (nl_striptext) AGAINST ('cleaner' IN BOOLEAN MODE)
)
LIMIT 15 OFFSET 0;

对于LIMIT 子句,您应该使用ORDER BY。否则结果是不确定的,因为查询的结果没有保证的顺序。

另外,请注意UNION 的使用。这将删除出现两个单词的重复项。

【讨论】:

  • 谢谢你的回答,你也是奥利!我遇到的问题是我正在使用为我编写查询字符串的第 3 方工具。我为一个可以将用户编写“钻头或清洁器”转换为布尔 sql 查询的函数奋斗了很长时间。我在互联网上寻找一个可以为我编写 sql 的 .net 函数。我认为这很常见,我想不会。
  • 我可以自己编写简单的查询,但我收到这样的查询; ("HSE" OR "quality control" OR "quality assurance" OR "qa" OR "qc") AND ("power generation" OR "power plant" OR "power station" OR "nuclear") 卡住了。
【解决方案2】:

您在这里有几个选择来解决这个 OR 问题。请记住,OR 比 AND 撒的网更广——匹配更多的东西。 AND 缩小搜索范围,OR 扩大搜索范围。

一种方法是在 MATCH 子句中更好地利用 BOOLEAN MODE,方法是在一次搜索中同时搜索这两个术语。

MATCH (nl_striptext) AGAINST ('driller cleaner' IN BOOLEAN MODE)

这可能是您最好的选择。速度很快。

您还可以使用两个搜索的 SQL UNION 来实现您的 OR 操作。 Gordon 在另一个答案中提供了这种方法。

【讨论】:

  • Ollie,你知道可以将用户搜索输入转换为sql查询的函数吗?
  • 那应该是一个不同的问题;这个是关于sql优化的。
  • 奥利,我问了question a few months back and had no replies。我也颠倒了互联网寻找解决方案。我认为这将是一个共同的挑战。但我一定是这个星球上唯一一个试图将用户输入转换为 MYSQL 友好查询的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多