我正在为我的网站的消息部分构建一个搜索功能,并且有一个略多于 9,000,000 行的消息数据库,以及索引sender
, subject
, and message
字段。我希望在查询中使用 LIKE mysql 子句,例如 (ex)
SELECT sender
, subject
, message
FROM Messages
WHERE message
像'%EXAMPLE_QUERY%';
检索结果。不幸的是,当存在前导通配符时,MySQL 不使用索引,并且这是必要的,因为搜索查询可能出现在消息中的任何位置(这就是通配符的工作原理,不是吗?)。查询是非常非常慢而且我也不能使用全文索引,因为烦人的 50% 规则(我无法排除那么多)。无论如何(或者甚至有任何替代方案)是否可以使用类似和两个通配符来优化查询?任何帮助表示赞赏。
您应该使用全文索引(您说过不能),自己设计全文搜索,或者从 MySQL 中卸载搜索并使用 Sphinx/Lucene。对于 Lucene,您可以使用 Zend Framework 中的 Zend_Search_Lucene 实现或使用 Solr。
MySQL中的普通索引是B+树,如果不知道字符串的开头,则不能使用它们(当开头有通配符时就是这种情况)
另一种选择是使用参考表自行实现搜索。将文本拆分为单词并创建包含单词、record_id 的表。然后,在搜索中,您将查询拆分为单词,并搜索参考表中的每个单词。通过这种方式,您不会将自己限制在整个文本的开头,而仅限于给定单词的开头(无论如何,您都会匹配其余单词)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)