基于标签的MySQL搜索

时间:2011-07-21 09:44:49

标签: php mysql algorithm

我想在MySQL中编写一个基于标签的搜索引擎,但我真的不知道如何获得愉快的结果。

我使用了LIKE,但是因为我在数据库中存储了超过18k个关键字,所以它很慢。

我得到的是这样一张桌子:

id(int,primary key)article_cloud(text)keyword(varchar(40),FULLTEXT INDEX)

所以我每行存储一个关键字,并将所有引用文章编号保存在article_cloud中。

我尝试了MATCH()AGAINST()的东西,只要用户输入整个关键字,它就可以正常工作。但我也想要一个建议搜索,以便在用户输入时弹出相关文章。所以我仍然需要一个类似于LIKE的声明,但更快。我不知道我能做什么。

也许这是基于标签的搜索的错误概念。如果您认识一个更好的,请告诉我。我已经和它斗争了好几天,无法找到一个令人满意的解决方案。感谢您阅读:)

3 个答案:

答案 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)

查看SphinxLucene

答案 2 :(得分:0)

  

我尝试了MATCH()AGAINST()的东西,只要用户输入整个关键字,它就可以正常工作。

您认为FULLTEXT意味着什么?

我的表中有40 000个条目,没有使用索引(本地使用),并使用LIKE '%SOMETHING%'

搜索最多0.1秒

您可以LIMIT查询输出

相关问题