我有一个约20万册书籍的数据库.我希望为用户提供一种通过标题快速搜索图书的方法.现在,有些标题可能有A,THE等前缀,并且标题中也可以有数字,因此搜索12应该匹配标题中带有"12","12"和"打"的书籍.这将通过AJAX工作,所以我需要确保数据库查询真的很快.
我假设大多数用户都会尝试使用标题中的某些单词进行搜索,因此我想将所有标题拆分为单词并创建一个单独的数据库表来将单词映射到标题.但是,我担心这可能不会给出最好的结果.例如,书名可能是一些2或3个常用词,我可能会得到一个包含更长标题的书籍列表,其中包含所有2-3个单词,而我正在寻找的书籍就像大海捞针一样丢失.此外,由于大量的OR子句,搜索标题中包含许多单词的书可能会减慢查询速度.
基本上,我正在寻找一种方法:
我认为这不是第一次有人需要这样的东西,我不想重新发明轮子.
PS我目前正在使用MySQL,但如果需要,我可以切换到其他任何东西.
把事情简单化。在标题字段上创建索引并使用通配符模式匹配。您不可能让它变得更快,因为您的瓶颈不是字符串匹配,而是您想要与标题匹配的字符串数量。
只是想出了一个不同的想法。你说有些词可以有不同的解释。比如十二、十二、十二。与其创建具有不同解释的查询,为什么不将标题的不同解释存储在单独的表中,并与书籍进行一对多。然后,您可以按 book_id GROUP BY 来获取唯一的书名。
说一下《一打一毛钱》这本书。在 books 表中它将是:
book_id=356
book_title='A dime in a dozen'
Run Code Online (Sandbox Code Playgroud)
在标题表中将存储:
titles_id=123
titles_book_id=356
titles_title='A dime in a dozen'
--
titles_id=124
titles_book_id=356
titles_title='A dime in a 12'
--
titles_id=125
titles_book_id=356
titles_title='A dime in a twelve'
Run Code Online (Sandbox Code Playgroud)
查询如下: SELECT b.book_id, b.book_title FROM books b JOIN books t on b.book_id=t.titles_book_id WHERE t.titles_title='%twelve%' GROUP BY b.book_id
现在,插入变成了一项更大的任务,但是创建变体可以在数据库外部完成并一次性插入。