我正在为我的网站的消息部分构建一个搜索功能,并且拥有一个包含9,000,000多个行的消息数据库,并在sender
,subject
和{{1字段。我希望在我的查询中使用LIKE mysql子句,例如(ex)
SELECT message
,sender
,subject
FROM message
WHERE Messages
LIKE'%EXAMPLE_QUERY%';
检索结果。遗憾的是,当存在前导通配符时,MySQL不使用索引,这对于搜索查询可能出现在消息中的任何位置(这是通配符的工作原理,不是吗?)。查询非常非常慢,我也不能使用全文索引,因为烦人的50%规则(我根本无法排除这么多)。无论如何(或者甚至是任何替代方案)使用like和两个通配符来优化查询?任何帮助表示赞赏。
答案 0 :(得分:3)
您应该使用全文索引(您说不能),自己设计全文搜索或从MySQL卸载搜索并使用Sphinx / Lucene。对于Lucene,您可以使用Zend Framework中的Zend_Search_Lucene实现或使用Solr。
MySQL中的普通索引是B + Trees,如果不知道字符串的开头就不能使用它们(当你在开头有通配符时就是这种情况)
另一种选择是使用参考表自己实现搜索。在单词中拆分文本并创建包含word,record_id的表。然后在搜索中,您将用单词拆分查询并搜索参考表中的每个单词。这样你就不会把自己限制在整个文本的开头,而只是限制在给定单词的开头(并且你会与其他单词匹配)
答案 1 :(得分:0)
'%EXAMPLE_QUERY%';
是一个非常糟糕的主意..我会给你一些
一个。在LIKE查询开始时使用'EXAMPLE_QUERY%';
代替
B中。创建可以轻松使用MATCH
答案 2 :(得分:0)
如果你想坚持使用MySQL,你应该使用FULL TEXT索引。全文索引文本块中的索引词。然后,您可以搜索词干并按相关性顺序返回结果。所以你可以在一个文本块中找到“example”这个词,但你仍然无法在“xampl”上有效搜索以找到“example”。
MySQL的全文搜索功能不是很好,但功能齐全。
答案 3 :(得分:-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%';
给出emp_name,其中第二个字母是。