我正在为我的网站做一个搜索引擎。我应该如何设计保存索引词列表的表。
早些时候我想是这样的:
表:tbl_indexedwords有两列iw_wordid和iw_word。
表:tbl_wordoccurrence有4列wo_occurrenceid,wo_wordid,wo_pageid,wo_numberofoccurrences。
现在,如果用户在搜索框中输入两个以上的单词,这种设计将无法正常工作。假设foo bar。即使foo和两个都出现在表bar中,并且相应的细节在tbl_indexedwords中,我的搜索引擎脚本将对其结果为“tbl_wordoccurrence > wo_numberofoccurrences或foo的结果排序。它看不到bar和foo是否相邻,因为没有列表示单词的出现顺序。我希望我能明白我在说什么。
另一个想法是将表设为3列。忘记bar并用唯一的tbl_wordoccurrence存储页面中的每个单词。现在,这可以解决我的问题,因为我知道单词的出现顺序。如果某个词的wo_numberofoccurences是另一个词的wo_occurrenceid+1或wo_occurrenceid-1,则这两个词并排出现。
这个设计的问题是它会占用很多空间。我的网站有很多内容。我认为这种方法会使它变慢(虽然不确定)。还有其他的设计能帮到我吗?还是我要和第二个一起去?我敢肯定第一个是行不通的,所以放弃它。

最佳答案

如果您的网站内容在数据库中(我假设),那么如果您使用FULLTEXT索引,甚至不需要创建单独的表。如果您使用的是mysql,那么它具有这样的功能,请参见herehere示例。如果你使用MSSQL,它也有自己的FULLTEXT索引能力,比如例子AA>和AA>
如果你坚持要有一个单独的搜索表,那么你很可能只需要一个表,比如:

Table  : tbl_wordsoccurrence
Fields : words_id, words
(and if you like you can include also number_of_occurences and page_id fields)

在上表中,您可以存储一个单词如programming或短语如php programming。
另一方面,如果您的网站static意味着内容没有保存在数据库中,因此必须手动进行更改,而不是通过常规的用户输入,那么这是另一回事。

09-10 09:01
查看更多