我想在MySQL中编写一个基于标签的搜索引擎,但我真的不知道如何获得愉快的结果。
我使用了LIKE,但是因为我在数据库中存储了超过18k个关键字,所以它很慢。
我得到的是这样一张桌子:
id(int,primary key)article_cloud(text)keyword(varchar(40),FULLTEXT INDEX)
所以我每行存储一个关键字,并将所有引用文章编号保存在article_cloud中。
我尝试了MATCH()AGAINST()的东西,只要用户输入整个关键字,它就可以正常工作。但我也想要一个建议搜索,以便在用户输入时弹出相关文章。所以我仍然需要一个类似于LIKE的声明,但更快。我不知道我能做什么。
也许这是基于标签的搜索的错误概念。如果您认识一个更好的,请告诉我。我已经和它斗争了好几天,无法找到一个令人满意的解决方案。感谢您阅读:)
答案 0 :(得分:4)
MATCH()反对()/ FULLTEXT搜索是对问题的快速解决方法 - 但您的架构完全没有意义 - 每篇文章中肯定有多个关键字?
表示在一个只包含一个单词的列上使用全文索引并保存article_cloud
中的所有引用文章编号
没有!在单个列中存储多个值是非常糟糕的做法。当这些值是另一张桌子的钥匙时,这是一个致命的罪!
看起来你已经走过了漫长的旅程,创造出能够有效运作的东西;达到目标的最快途径可能是在您自己的数据上使用Google或Yahoo的索引服务。但如果你想自己解决它......
See this answer on creating a search engine - 关键字应位于与您的文章有N:1关系的单独表格中,关键字和文章ID的主键,例如。
CREATE TABLE article (
id INTEGER NOT NULL autoincrement,
modified TIMESTAMP,
content TEXT
...
PRIMARY KEY (id)
);
CREATE TABLE keyword (
word VARCHAR(20),
article_id INTEGER, /* references article.id
relevance FLOAT DEFAULT 0.5, /* allow users to record relevance of keyword to article*/
PRIMARY KEY (word, article_id)
);
CREATE TEMPORARY TABLE search (
word VARCHAR(20),
PRIMARY KEY (word)
);
然后拆分用户输入的单词,将它们转换为一致的大小写(与填充关键字表格相同)并填充搜索表,然后使用....找到匹配项。
SELECT article.id, SUM(keyword.relevance)
FROM article, keyword, search
WHERE article.id=keyword.article_id
AND keyword.word=search.word
GROUP BY article_id
ORDER BY SUM(keyword.relevance) DESC
LIMIT 0,3
如果您可以维护关于不用作关键字的单词的单词或规则列表,那将会更有效率(例如,忽略混合或小写的3个字符或更少的单词将省略诸如'a'之类的内容,'到','是','和','他'......)。
答案 1 :(得分:1)
答案 2 :(得分:0)
我尝试了MATCH()AGAINST()的东西,只要用户输入整个关键字,它就可以正常工作。
您认为FULLTEXT意味着什么?
我的表中有40 000个条目,没有使用索引(本地使用),并使用LIKE '%SOMETHING%'
您可以LIMIT
查询输出