我打算用PHP编写搜索引擎代码,这样我的公司就可以搜索多个项目中包含的文本,每个项目都包含在一个独特的sqlite数据库文件中。
因为在某些时候会有超过100个项目(超过100个sqlite数据库),我想知道以下哪个(如果有的话)将是一个更聪明的编程选择:
我真的不知道做任何一个选项需要多长时间,或者哪个是更好的做法。大多数数据库文件都是<1MB。
非常感谢!
答案 0 :(得分:1)
我没有做过类似的事情,但在你的情况下,我可能会创建一个包含其他数据库内容的数据库,如果数据非常动态,那么除非你运行脚本,否则这个选项不起作用使用cronjob复制数据,如每个午夜或每周或其他任何内容。 此外,如果数据库是相似的 - 我的意思是他们有类似的结构(由于搜索会有意义),那么我可能会使用我上面的建议。 在不知道数据库有多复杂的情况下很难说清楚。
答案 1 :(得分:1)
首先:不要忘记,除非你在PHP-GTK中开发一些图形应用程序,否则PHP页面加载是无状态的。这意味着如果您选择选项1,则需要在某处缓存数据(例如,不同的数据库)。无论如何,我不会把它留在记忆中。
此外,它取决于您设置的索引类型。如果数据库具有全文索引,则100个文本搜索可以非常快。
因此,循环浏览文件是一种选择。由于必须打开100个不同的SQLite文件,可能会有一些开销。此外,您不应忘记在完成后关闭每个文件以减少内存使用量。您需要确保所有SQlite DB都已正确编入索引。
另一种可能性是创建一个本地数据库,其中包含所有可搜索的数据和与可以找到原始数据的sqlite文件相关的额外元数据,以及检查它们的最后时间戳。然后在每个请求中,您可以检查sqlite文件的最后修改时间戳,并将修改后的SQlite DB中的任何新数据复制到本地数据库,更新时间戳,并在本地数据库中搜索。 在这种情况下的性能将取决于SQlite文件的更新频率以及如何同步mutch数据,但我相信在您的情况下它就足够了。
答案 2 :(得分:0)
我绝对不会阅读所有内容,然后通过php搜索,这是非常低效的。创建一些非常有效的查询然后在有用户查询后在所有数据库上运行它们会更有效。如果您能设法通知用户您的搜索状态非常有帮助。即提供您当前正在搜索的数据库以及剩余数量
答案 3 :(得分:0)
创建所有数据库的索引并定期更新。由于这是只读的,所以不应该是一个大问题。
简单的单词索引可以只是
word[ [document,occurrences], [document,occurrences] ... ]
就像在&#34; foo&#34;出现在文件1,3次,文件4次,5次。
foo[ [1,3] , [4,5] ]
这不会让你进行精确的词组搜索,但它简单快捷。