我正在尝试为我的网站制作搜索引擎。我应该如何设计保留索引词列表的表。
早些时候我想过这样的事情:
表:tbl_indexedwords
有2列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
1}}适用于bar
或foo
。它不会看到bar
和tbl_wordoccurrence
是否彼此相邻,因为没有列的出现顺序列。我希望我清楚我在这里说的话。
另一个想法可能是制作3列的表wo_numberofoccurences
。忘记wo_occurrenceid
并将每个单词存储在唯一wo_occurrenceid
的页面中。现在,这将解决我的问题,因为我知道单词出现的顺序。如果某个单词的wo_occurrenceid
为wo_occurrenceid
+ 1或{{1}} - 其他单词的1,那么这两个单词并排出现。
这种设计的问题在于它会占用大量空间。我的网站有很多内容。我认为这种方法会让它变慢(但不确定)。还有其他设计可以帮助我吗?或者我必须选择第二个吗?我确信第一个不会起作用,所以放弃它。
答案 0 :(得分:3)
如果您的网站内容在数据库上(我假设),如果您使用FULLTEXT
索引,则甚至不需要创建单独的表。如果您正在使用mySQL,那么它具有此功能,请参阅示例here和here。如果您使用的是MSSQL,它还拥有自己的FULLTEXT
索引功能,如示例here和here
如果您坚持要有一个单独的表格进行搜索,那么您很可能只需要一个表格,如:
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
,则表示内容未保存在数据库中,因此必须手动进行更改,而不是通过常规用户输入,这是另一个故事。