如何设计一个有效搜索能力的数据库?

时间:2013-06-29 18:25:26

标签: sql search database-design

我正在尝试设计一个具有搜索功能的数据库。我对数据库设计和SQL的了解都是自学成才的,而且还是初学者级的,所以我的问题可能很简单。

假设我有一个包含大量记录的表。例如,假设每条记录包含不同计算机应用程序的详细信息(名称,开发人员,版本号等)。关键字列表与每条记录相关联,例如用于编写应用程序的编程语言列表。

我希望能够在搜索框中输入一个或多个关键字(每个关键字用空格分隔),并且我希望返回所有相关记录。我应该如何设计数据库来存储关键字,以及我需要将哪些SQL查询应用于搜索文本? (搜索应该是大写/小写独立。)

我的下一个挑战是按相关性排序搜索结果,并允许整个关键短语和关键字与每条记录相关联。例如,如果我在搜索字段中键入“Visual Basic”,我希望第一个结果具有与它们关联的关键短语“Visual Basic”。下一个结果应该都包含与它们相关联的关键字“Visual”和“Basic”,其余结果应该只包含其中一个关键字。再次,请有人建议如何实现这个?

我认为最后的挑战会更加困难:我可以设计数据库和SQL代码来处理多少“智能解释”?例如,如果我搜索“CSS”,我可以获得带有关键短语“Cascading Style Sheets”的记录吗?我是否还可以通过SQL来识别和搜索类似的单词,例如复数搜索短语,或者在输入“程序”时搜索“程序员”或“编程”?谢谢!

3 个答案:

答案 0 :(得分:3)

学习关系代数,规范化规则和SQL。

从实体关系开始。听起来你可以把一个APPLICATION表作为FEATURE子表的父表,两者之间有一对多的关系。你可以通过将一个连接到另一个来查询它们:

SELECT A.NAME, F.NAME
FROM APPLICATION AS A 
JOIN FEATURE AS F
ON F.APP_ID = A.ID

您的挑战不会暗示SQL和我的关系。我会更多地考虑解析器,索引器和搜索引擎(如Lucene)和NoSQL文档数据库(如MongoDB)。

答案 1 :(得分:0)

经过大量研究后,我得出结论,@ duffymo的回答暗示了正确的方向。为了像我这样的其他n00bs的好处,这是我得出的结论:

许多开源搜索引擎服务器应用程序都可以免费安装。 Lucene是我第一次听说过它们,但其他人确实存在,我认为我最喜欢的是Sphinx。据我所知,@ duffymo提到的'索引器'是内置的。我了解到索引器是一个程序,它将检查我的数据库中的关键字,并自动记录应该为不同的输入查询返回哪些结果。我现在也了解到我所寻找的行为(以及Sphinx所具有的行为)的术语是“阻止”。我还不确定解析器在这一切中起什么作用...

更基本的方法是使用SQL本身。虽然我已经意识到其中最基本的(即使用带有'通配符'的LIKE关键字),但我还发现了一些更强大的东西:自然语言/全文搜索。对于任何对安装服务器应用程序不感兴趣的人,我建议你仔细查看。

另外,我认为没有理由需要使用NoSQL而不是SQL(正如@duffymo所建议的那样),所以我现在要坚持使用SQL(至少在我遇到一些好的条目之前) - 从中​​学习NoSQL的书籍。此外,我很少有意学习关系代数,直到我知道为什么我应该和 它将如何有用。这里的信息是其他初学者不应该被这些东西所取代,因为我认为Sphinx不需要任何知识。

答案 2 :(得分:0)

虽然我喜欢@ duffymo的回答,但我也建议你研究SPARQL和wordnet项目来解决你的语义等价问题。

如果选择Oracle,则可以使用空间选项三元组来实现SPARQL端点,并执行一些非常好的搜索,例如css = Cascading Style Sheet示例。