我正在使用PHP和MySQL运行Apache服务器。
我想创建一个简单的搜索引擎,找到包含某个字符串的文章。
我有30,000个文件,分隔页(我的意思是,总共30,000个文件)
我认为有两种方法可以完成这项任务。
在表格中插入30,000条记录(行)。然后mysql_query
查找具有查询字符串的记录。
插入30条记录(行),每条记录1000条。然后mysql_query
找到包含查询字符串的记录,然后用PHP explode
分隔文章..
哪一个更快?
我将使用Select * from mytable where contenttext LIKE '%querystring%'
主要概念是
在30,000个文档中使用mysql_query
和%通配符
在30个文档中使用带有%通配符的mysql_query
,然后再使用PHP explode
和strpos
进行搜索。
谢谢!
更多细节:
第一个概念 - >每个插入整个记录
第1行:filename = aaaa1.doc,content = stack overflow是...的网站
第2行:filename = aaaa2.doc,content = stack exchange是......
的网站第3行:filename = bbbb1.doc,content =播放音乐......
第4行:filename = bbbb2.doc,content = coffee and cake
第二个概念 - >假设没有令牌扭曲,插入记录与灌浆
第1行:filename = aaaa,content = stack overflow是| -token- | stack exchange的网站....
第2行:filename = bbbb,content =播放音乐| -token- |咖啡和蛋糕| -token- | ....
答案 0 :(得分:1)
在大多数情况下,将30,000条记录(行)放到表中会更快。此外,如果你有30,000个文件/记录,将它们连接成更少的行将违反正常形式,并且违反正常形式通常会在速度,一致性和可维护性方面受到惩罚。您还可以期望像MySQL这样的DBMS不会为每一行解释LIKE '%querystring%'
,而是及时编译它,这意味着查询将非常快。
原因很简单,如果MySQL匹配字符串,字符串将直接匹配。如果你在PHP上对来自MySQL的数据执行字符串匹配,首先必须通过SQL接口将它从MySQL复制到PHP。
根据您要搜索的内容,您可能需要考虑使用计算机语言算法来查找匹配但具有定性匹配的行。
编辑(因为问题编辑):您实际上应该有两个或三个表。一个列出所有文档的表。一个表映射哪个页面在哪个文档中。还有一个列出页面内容的表。页面内容和文档映射可以连接到同一个表中。像这样:
CREATE TABLE Documents (
id PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255)
);
CREATE TABLE Pages (
id PRIMARY KEY AUTO_INCREMENT,
documentId INT REFERENCES(Documents.id),
text TEXT,
FOREIGN KEY(documentId) REFERENCES Documents(id))
);
然后您将执行如下查询:
SELECT Documents.name, Pages.text FROM Documents, Pages WHERE Documents.id = Pages.documentId AND text LIKE '%querystring%';