如何快速搜索书名?

时间:2011-05-08 15:43:28

标签: algorithm search

我有一个大约20万本书的数据库。我希望为用户提供一种通过标题快速搜索图书的方法。现在,有些标题可能有A,THE等前缀,也可能在标题中有数字,因此搜索12应该匹配标题中带有“12”,“12”和“打”的书籍。这将通过AJAX工作,所以我需要确保数据库查询非常快。

我假设大多数用户会尝试使用标题中的某些单词进行搜索,因此我想将所有标题拆分为单词并创建一个单独的数据库表,将单词映射到标题。但是,我担心这可能不会给出最好的结果。例如,书名可能是一些2或3个常用词,我可能会得到一个包含更长标题的书籍列表,其中包含所有2-3个单词,而我正在寻找的书籍就像在大海捞针一样丢失。此外,由于大量的OR子句,搜索标题中包含许多单词的书可能会减慢查询速度。

基本上,我正在寻找一种方法:

  • 快速找到结果
  • 按相关性排序。

我认为这不是第一次有人需要这样的东西,我不想重新发明轮子。

P.S。我目前正在使用MySQL,但如果需要,我可以切换到其他任何东西。

5 个答案:

答案 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