0

我正在尝试设计一个以搜索能力为核心的数据库。我对数据库设计和 SQL 的了解都是自学的,而且还是相当初级的,所以我的问题可能很容易回答。

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

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

然后我的下一个挑战是按相关性对搜索结果进行排序,并允许将整个关键短语以及关键字与每条记录相关联。例如,如果我在搜索字段中键入“Visual Basic”,我希望第一个结果准确地具有与其相关联的关键短语“Visual Basic”。下一个结果应该都有与之关联的关键字“Visual”和“Basic”,其余结果应该只有其中一个关键字。再次,请任何人就如何实现这一点提出建议?

我相信最后的挑战会更加困难:我可以设计我的数据库和 SQL 代码来处理多少“智能解释”?例如,如果我搜索“CSS”,是否可以显示带有关键短语“Cascading Style Sheets”的记录?我是否还可以让 SQL 识别和搜索相似的词,例如搜索短语的复数形式,或者输入“program”时的“programmer”或“programming”?谢谢!

4

3 回答 3

4

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

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

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

你的挑战不会向我暗示 SQL 和关系。我会更多地考虑解析器、索引器和像 Lucene 这样的搜索引擎,以及像 MongoDB 这样的 NoSQL 文档数据库。

于 2013-06-29T18:28:58.150 回答
0

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

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

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

此外,我认为没有理由需要使用 NoSQL 代替 SQL(正如@duffymo 所建议的那样),所以我暂时将坚持使用 SQL(至少在我遇到一些好的入门级书籍之前)学习 NoSQL)。此外,在我知道我为什么应该学习以及它如何有用之前,我几乎没有学习关系代数的意图。这里的信息是其他初学者不应该对这些事情感到反感,因为我认为 Sphinx 不需要任何知识。

于 2013-07-05T20:04:05.870 回答
0

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

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

于 2013-07-06T13:02:23.223 回答