我有一个大约20万本书的数据库。我希望为用户提供一种通过标题快速搜索图书的方法。现在,有些标题可能有A,THE等前缀,也可能在标题中有数字,因此搜索12应该匹配标题中带有“12”,“12”和“打”的书籍。这将通过AJAX工作,所以我需要确保数据库查询非常快。
我假设大多数用户会尝试使用标题中的某些单词进行搜索,因此我想将所有标题拆分为单词并创建一个单独的数据库表,将单词映射到标题。但是,我担心这可能不会给出最好的结果。例如,书名可能是一些2或3个常用词,我可能会得到一个包含更长标题的书籍列表,其中包含所有2-3个单词,而我正在寻找的书籍就像在大海捞针一样丢失。此外,由于大量的OR子句,搜索标题中包含许多单词的书可能会减慢查询速度。
基本上,我正在寻找一种方法:
我认为这不是第一次有人需要这样的东西,我不想重新发明轮子。
P.S。我目前正在使用MySQL,但如果需要,我可以切换到其他任何东西。
答案 0 :(得分:1)
保持简单。在标题字段上创建索引并使用通配符模式匹配。你不可能更快地做到这一点,因为你的瓶颈不是字符串匹配,而是你想要与标题匹配的字符串数量。
然后提出了一个不同的想法。你说有些词可以用不同的方式解释。像12,十二,十二。为什么不在一个单独的表中存储对标题的不同解释,而不是创建具有不同解释的查询。然后,您可以通过GROUP BY book_id获取唯一的书名。
说出“十几分钱”这本书。在书籍表中,它将是:
book_id=356
book_title='A dime in a dozen'
在titles表中将存储:
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'
查询: SELECT b.book_id,b.book_title 来自书籍b在b.book_id = t.titles_book_id上加入标题 在哪里t.titles_title ='%12%' GROUP BY b.book_id
现在,插入变得更加重要,但是创建变体可以在数据库外部完成并一次性插入。
答案 1 :(得分:1)
一种容易满足您的数据量和速度要求的解决方案是使用Redis键值对存储。 我看到它的方式,你可以继续你的标题到关键字的映射解决方案,并将其存储在以下形式:
keyword:书名集
Redis已经有一个你可以使用的内置set数据类型。
接下来,要获取包含搜索关键字的图书标题,您可以使用sinter命令为您设置交集。
一切都在记忆中完成;因此响应时间非常快。 此外,如果要保存索引,redis有许多不同的持久性/缓存机制。
答案 2 :(得分:1)
您可能需要查看Apache Lucene。这是一个基于Java的高性能信息检索系统。
你想要创建一个IndexWriter,并为你的所有标题编制索引,你可以添加链接到实际书籍的参数(看看这个类)。
搜索时,你需要一个IndexReader和一个IndexSearcher,并对它们使用search()oporation。
请查看以下示例:src / demo和:http://lucene.apache.org/java/2_4_0/demo2.html
使用信息检索技术会使索引花费更长时间,但每次搜索都不需要通过大多数标题,总体而言,您可以期望更好的搜索性能。
另外,选择好的分析器可以让你忽略“a”,“a”这样的词......
答案 3 :(得分:1)
使用SOUNDEX是我认为最好的方式。
SELECT
id,
title
FROM products AS p
WHERE p.title SOUNDS LIKE 'Shaw'
// This will match 'Saw' etc.
为获得最佳数据库性能,您可以最好地计算标题的SOUNDEX值并将其放入新列中。您可以使用SOUNDEX('Hello')计算soundex。
使用示例:
UPDATE `books` SET `soundex_title` = SOUNDEX(title);
答案 4 :(得分:1)
带有Lucene的Apache Solr对您的问题来说绝对是一个非常好的选择
您可以直接链接Solr / Lucene直接索引您的MySQL数据库。这是一个关于如何将MySQL数据库与Lucene / Solr链接起来的简单教程:http://www.cabotsolutions.com/2009/05/using-solr-lucene-for-full-text-search-with-mysql-db/
以下是使用Lucene-Solr而不是MySQL全文搜索的优点和难点:http://jayant7k.blogspot.com/2006/05/mysql-fulltext-search-versus-lucene.html