当前位置: 首页 > 面试题库 >

以任何方式在InnoDB上实现类似全文的搜索

仉洲
2023-03-14
问题内容

我有一个非常简单的查询:

SELECT ... WHERE row LIKE '%some%' OR row LIKE '%search%' OR  row LIKE '%string%'

进行搜索some search string,但是正如您所看到的,它会分别搜索每个字符串,而且对性能也不好。

有没有一种方法可以在InnoDB表上使用LIKE重新创建类似全文的搜索。当然,我知道我可以使用Sphinx之类的东西来实现此目的,但是我正在寻找一个纯MySQL解决方案。


问题答案:

使用myisam全文表来索引回innodb表,例如:

使用innodb构建系统:

create table users (...) engine=innodb;

create table forums (...) engine=innodb;

create table threads
(
forum_id smallint unsigned not null,
thread_id int unsigned not null default 0,
user_id int unsigned not null,
subject varchar(255) not null, -- gonna want to search this... !!
created_date datetime not null,
next_reply_id int unsigned not null default 0,
view_count int unsigned not null default 0,
primary key (forum_id, thread_id) -- composite clustered PK index
)
engine=innodb;

现在是全文搜索表,我们将使用它来索引回innodb表。您可以使用触发器或每晚进行批更新等来维护此表中的行。

create table threads_ft
(
forum_id smallint unsigned not null,
thread_id int unsigned not null default 0,
subject varchar(255) not null,
fulltext (subject), -- fulltext index on subject
primary key (forum_id, thread_id) -- composite non-clustered index 
)
engine=myisam;

最后,您从php /应用程序调用的搜索存储过程:

drop procedure if exists ft_search_threads;
delimiter #

create procedure ft_search_threads
(
in p_search varchar(255)
)
begin

select
 t.*,
 f.title as forum_title,
 u.username,
 match(tft.subject) against (p_search in boolean mode) as rank
from
 threads_ft tft
inner join threads t on tft.forum_id = t.forum_id and tft.thread_id = t.thread_id
inner join forums f on t.forum_id = f.forum_id
inner join users u on t.user_id = u.user_id
where
 match(tft.subject) against (p_search in boolean mode) 
order by 
 rank desc
limit 100;

end;

call ft_search_threads('+innodb +clustered +index');

希望这可以帮助 :)



 类似资料:
  • 问题内容: 我正在开发一个高容量的Web应用程序,其中的一部分是讨论帖子的MySQL数据库,该数据库需要平稳地增长到2000万+行。 我本来打算对表使用MyISAM(用于内置的全文本搜索功能),但是由于单个写入操作而使 整个表 被锁定的想法使我陷入困境。行级锁具有更大的意义(更不用说InnoDB在处理大型表时的其他速度优势)。因此,基于这个原因,我决心使用InnoDB。 问题是… InnoDB没有

  • Rails 实现全文搜索 ElasticSearch 初次使用小结,一起学习进步哈~ MongoDB + Rails 有什么好的全文搜索的办法吗? Sunspot 学习笔记 做了一个脚本,方便大家用 Sunpot 做中文全文索引 How search and index works (Ruby 语言描述)

  • 我被要求实现这个函数,它等待一些操作完成。然后让它做它应该做的事情。我被要求不要使用观察者类。我尝试了无限循环,它成功了。所以我想知道是否还有其他方法可以做到这一点。(我正在Jade中开发一个应用程序,超级代理与其他代理进行通信,一旦代理收到消息,他就可以执行一些功能并发送回消息)。我想为等待的部分做点什么。提前感谢

  • 在为存储在本地数据库中的数据实现搜索功能时,您将如何处理? > 每次用户输入 桌子上有200-300行。每行包含10-15列。 附言:我总是对缓存的列表执行过滤,主要是因为无论如何我都需要显示完整的列表,所以整个数据集已经被预取了。 让我们假设您不必首先显示整个列表,并且只在用户开始键入时显示,在这种情况下执行数据库查询总体上更好吗? 我只是不确定。我看见一位同事在做询问。 是的,我懒得测试数据库

  • 我已经在我的angularjs应用程序中实现了默认搜索,代码如下: 我在这里面临的问题是,假设有人碰巧触发了某个关键字,而这些关键字在被重复的记录中并不存在。我想要一条消息,说“什么也没找到”或者别的什么。 我如何实现这个逻辑?我在这里看了不同的文章和几个问题,找不到这方面的任何东西。我如何查看搜索的术语的长度是否为零,以便我可以ng-如果那个东西并显示消息?谢谢!

  • 本文向大家介绍jQuery实现的类似淘宝网站搜索框样式代码分享,包括了jQuery实现的类似淘宝网站搜索框样式代码分享的使用技巧和注意事项,需要的朋友参考一下 运行效果图:                                                ----------------------查看效果----------------------- 小提示:浏览器中如果不能正常运行