2

我正在为我的站点的消息部分构建一个搜索功能,并且有一个包含超过 9,000,000 行的消息数据库,以及在 、 和 字段上sendersubject索引message。我希望在查询中使用 LIKE mysql 子句,例如 (ex)

SELECT sender, subject, messageFROM MessagesWHERE messageLIKE '%EXAMPLE_QUERY%';

检索结果。不幸的是,当存在前导通配符时,MySQL 不使用索引,这是搜索查询可能出现在消息中的任何位置所必需的(这就是通配符的工作方式,不是吗?)。查询非常非常慢,我也不能使用全文索引,因为烦人的 50% 规则(我不能排除那么多)。无论如何(甚至,任何替代方法)都可以使用 like 和两个通配符优化查询吗?任何帮助表示赞赏。

4

4 回答 4

3

您应该使用全文索引(您说过不能),自己设计全文搜索或从 MySQL 卸载搜索并使用 Sphinx/Lucene。对于 Lucene,您可以使用 Zend Framework 中的 Zend_Search_Lucene 实现或使用 Solr。

MySQL 中的普通索引是 B+Trees,如果字符串的开头未知,则不能使用它们(当您在开头有通配符时就是这种情况)

另一种选择是使用参考表自行实现搜索。将文本拆分为单词并创建包含单词 record_id 的表。然后在搜索中,您将查询拆分为单词并搜索参考表中的每个单词。通过这种方式,您不会将自己限制在整个文本的开头,而仅限于给定单词的开头(无论如何您都会匹配其余单词)

于 2012-04-14T10:29:41.683 回答
0

'%EXAMPLE_QUERY%';是一个非常非常糟糕的主意..我会给你一些

A. 避免在 LIKE 查询开始时使用'EXAMPLE_QUERY%';通配符

B. 创建您可以轻松使用的关键字MATCH

于 2012-04-14T10:22:11.827 回答
0

如果你想坚持使用 MySQL,你应该使用 FULL TEXT 索引。全文索引索引文本块中的单词。然后,您可以搜索词干并按相关性顺序返回结果。所以你可以在一段文本中找到“example”这个词,但是你仍然不能在“xampl”上有效地搜索到“example”。

MySQL 的全文搜索功能不是很好,但功能齐全。

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

于 2012-04-14T11:41:24.717 回答
-3
select * from emp where ename like '%e';

给出以字母 e 结尾的 emp_name.

select * from emp where ename like 'A%';

给出以字母 a 开头的 emp_name.

select * from emp where ename like '_a%';

给出第二个字母是 a 的 emp_name.

于 2012-04-14T10:24:33.780 回答