如何使用标签搜索找到网站?

时间:2011-02-06 09:44:43

标签: php mysql full-text-search

我有以下tags表:

web           | tags
------------------------------------------------------------
google.com    | search,google,searchengine,engine,web 
facebook.com  | facebook,social,networking,friends 
youtube.com   | video,youtube,videos,entertainment 
yahoo.com     | yahoo,search,email,news,searchengine
bing.com      | search,searchengine,microsoft,bing,tools

我想要实现的是按标签搜索以从此表中获取网站列表。

例如,根据google.com进行某次搜索,我想从上面的示例表中列出yahoobing

如何使用PHP和MySQL实现这一目标? (我为此表启用了FULL TEXT SEARCH

2 个答案:

答案 0 :(得分:2)

这样的东西可能会给你你想要的结果,但它会很慢。也许其他人可以提供更有效的解决方案:

SELECT t1.* FROM tags AS t1 JOIN tags AS t2
  ON LIST_INTERSECT(t1.tags, t2.tags) != ''
  WHERE t1.web='google.com'

并且您还需要这个存储的函数(只需在连接到服务器并选择数据库后将此代码复制并粘贴到mysql客户端中):

DELIMITER $$
CREATE FUNCTION LIST_INTERSECT(
    list1 VARCHAR(255), list2 VARCHAR(255)
) RETURNS VARCHAR(255)
BEGIN
    SET @delim = ',';
    SET @list = list1;
    SET @overlap = '';
    LOOPING: LOOP
        IF (LOCATE(@delim, @list) > 0) THEN
            SET @word = SUBSTRING_INDEX(@list, @delim, 1);
            SET @list = SUBSTR(@list, LOCATE(@delim, @list) + 1);
        ELSE
            SET @word = @list;
            SET @list = NULL;
        END IF;
        IF (CONCAT(',',list2,',') LIKE CONCAT('%,',@word,',%')) THEN
            SET @newword = @word;
            IF (@overlap != '') THEN
                SET @newword = CONCAT(',', @word);
            END IF;
            SET @overlap = CONCAT(@overlap, @newword);
        END IF;
        IF (@list IS NULL) THEN
            LEAVE LOOPING;
        END IF;
    END LOOP LOOPING;
    RETURN @overlap;
END$$
DELIMITER ;

DELIMITER命令是将语句分隔符从“;”更改为“$$”并返回。您需要这样做才能定义custom functions or procedures。)

基本上,此代码会在web列中查找某个网站,然后会找到在tags列中共享其关键字的所有其他网站。使用此功能,如果您搜索“google.com”,它还会返回“bing.com”和“yahoo.com”,因为所有这三条记录都在tags中有“搜索”和“搜索”。

答案 1 :(得分:0)

是否不可能同时拥有一个Web表和标签表以及将它们连接在一起的表?

如果你的结构真的无法改变,那么像SELECT * FROM web WHERE tags LIKE '%google%'这样的东西就可以了。