Php 基于标签的MySQL搜索

Php 基于标签的MySQL搜索,php,mysql,algorithm,Php,Mysql,Algorithm,我想用MySQL编写一个基于标签的搜索引擎,但我真的不知道如何获得令人满意的结果 我用LIKE,但由于我在数据库中存储了超过18k的关键字,速度相当慢 我得到的是这样一张桌子: IDIT,主键文章\u cloudtext关键字VARCHAR40,全文索引 因此,我每行存储一个关键字,并将所有引用的文章编号保存在article_cloud中 我尝试了与stuff的匹配,只要用户输入完整的关键字,它就可以正常工作。但是我还需要一个建议搜索,这样当用户输入时,就会弹出相关文章。因此,我仍然需要一个类似

我想用MySQL编写一个基于标签的搜索引擎,但我真的不知道如何获得令人满意的结果

我用LIKE,但由于我在数据库中存储了超过18k的关键字,速度相当慢

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

IDIT,主键文章\u cloudtext关键字VARCHAR40,全文索引

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

我尝试了与stuff的匹配,只要用户输入完整的关键字,它就可以正常工作。但是我还需要一个建议搜索,这样当用户输入时,就会弹出相关文章。因此,我仍然需要一个类似的语句来表示喜欢,但速度更快。我不知道我能做什么

也许这是基于标记的搜索的错误概念。如果你知道更好的,请告诉我。我已经为此奋斗了好几天,却找不出一个令人满意的解决方案。感谢阅读:

我尝试了与stuff的匹配,只要用户输入完整的关键字,它就可以正常工作

你认为全文是什么意思

我的表中有40000个条目,没有使用本地使用的索引,它用“%SOMETHING%”之类的词搜索了最多0.1秒

您可以限制查询输出

我尝试了与stuff的匹配,只要用户输入完整的关键字,它就可以正常工作

你认为全文是什么意思

我的表中有40000个条目,没有使用本地使用的索引,它用“%SOMETHING%”之类的词搜索了最多0.1秒


您可以限制查询输出

查看和

查看和

匹配/全文搜索是解决问题的快速方法-但您的模式毫无意义-每篇文章中肯定有多个关键字?对只包含一个单词的列使用全文索引是相当愚蠢的

并将所有参考文章编号保存在文章云中

不!在一列中存储多个值是非常糟糕的做法。当这些值是另一个表的键时,这是一种致命的罪恶

看起来你前面还有很长的路要走,去创造一些能有效工作的东西;实现这一目标的最快途径可能是对您自己的数据使用谷歌或雅虎的索引服务。但是如果你想自己修好的话

-关键字应位于单独的表中,与您的文章、关键字主键和文章id具有N:1关系,例如

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”、“to”、“was”、“and”之类的内容,“He”…

匹配/全文搜索是一个快速解决问题的方法-但您的模式毫无意义-每篇文章中肯定有多个关键字?对只包含一个单词的列使用全文索引是相当愚蠢的

并将所有参考文章编号保存在文章云中

不!在一列中存储多个值是非常糟糕的做法。当这些值是另一个表的键时,这是一种致命的罪恶

看起来你前面还有很长的路要走,去创造一些能有效工作的东西;实现这一目标的最快途径可能是对您自己的数据使用谷歌或雅虎的索引服务。但是如果你想自己修好的话

-关键字应位于单独的表中,与您的文章、关键字主键和文章id具有N:1关系,例如

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”、“to”、“was”、“He”之类的内容。…

我知道全文的意思。正如我所说,它很好用,但这不是我想要的。我确实限制到了11,但仍然需要大约0.5-0.9秒,这太慢了。只需使用像“%”这样的限制。或者尝试一下,但我有不好的经验,我知道全文的意思。正如我所说,它很好用,但这不是我想要的。我确实限制到了11,但仍然需要大约0.5-0.9秒,这太慢了。只需使用像“%”这样的限制。或者尝试一下,但我在这方面有不好的经验。因为这是一家乐器商店,有很多关键词涉及大量的文章。我会试试看,但问题是,我不知道关键字表会变得多大。现在我保存了大约18k个关键字。如果我像你写的那样构造它,它可能会变大4到5倍
. 但感谢你的这个想法,我一定会尝试一下,也许在第三次阅读你的文章后,它会变得越来越有意义,它的效果会比我的好。非常感谢你的帮助!我实现了它,它的速度真是太快了。没想到。非常感谢!因为它是一家乐器商店,所以有很多关键词涉及大量的文章。我会试试看,但问题是,我不知道关键字表会变得多大。现在我保存了大约18k个关键字。如果我像你写的那样构造它,它可能会变大4到5倍。但感谢你的这个想法,我一定会尝试一下,也许在第三次阅读你的文章后,它会变得越来越有意义,它的效果会比我的好。非常感谢你的帮助!我实现了它,它的速度真是太快了。没想到。非常感谢!