2011-04-27 103 views
0

首先: - 我不能使用獅身人面像,因爲我使用共享主機 - 我不喜歡谷歌解決方案即。自定義搜索有這些愚蠢的廣告和網站搜索不是免費的php/mysql:自定義網站搜索

我想創建自己的搜索mechanizm。我有頁表,我想通過關鍵字搜索頁面內容,並且在結果頁上我想顯示與所需關鍵字匹配的文本的一部分(與谷歌相同)。

先進

+0

參考:[mySQL手冊:全文搜索功能](http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html) – 2011-04-27 23:02:21

+1

可能重複[如何製作搜索引擎的網站?](http:// stackoverflow。問題/ 2810015 /如何使一個搜索引擎的網站) – 2011-04-27 23:03:01

+0

我忘了noitce,我有alrady設置我的數據庫爲innoDB,所以我不能使用全文搜索。 – Milos 2011-04-28 09:04:02

回答

1

然後THX你有兩個(半)選擇:你想要搜索

  • 寫你自己的索引,事中的數據

    • 使用MyISAM引擎
    • 更改託管或更改DBMS(1/2解決方案)

    下面是如何做的簡短版本第二選項

    假設您要搜索文章的內容。 基本上你必須創建一個你可能想要搜索的所有單詞的索引。

    下面的代碼取自書SQL Antipatterns和修改只有微小的一點。

    我會認爲你想索引的文章:

    CREATE TABLE Articles(
        article_id INT AUTO_INCREMENT, 
        title VARCHAR(120), 
        content TEXT, 
        PRIMARY KEY (article_id) 
    ); 
    

    你需要的關鍵詞表(每個關鍵字可以在多篇文章):

    CREATE TABLE Keywords(
        keyword_id INT AUTO_INCREMENT, 
        keyword VARCHAR(40) UNIQUE NOT NULL, 
        PRIMARY KEY (keyword_id) 
    ); 
    

    現在的表來實現多一對多的關係:

    CREATE TABLE ArticlesKeywords(
        keyword_id INT, 
        article_id INT, 
        PRIMARY KEY (keyword_id , article_id), 
        FOREIGN KEY (keyword_id) REFERENCES Keywords(keyword_id), 
        FOREIGN KEY (article_id) REFERENCES Articles(article_id) 
    ); 
    

    然後你創建一個存儲過程,它填充您的索引機制:

    CREATE PROCEDURE ArticlesSearch(keyword VARCHAR(40)) 
    BEGIN 
        SET @keyword = keyword; 
        PREPARE s1 FROM 'SELECT MAX(keyword_id) INTO @k FROM Keywords 
         WHERE keyword = ?'; 
        EXECUTE s1 USING @keyword; 
        DEALLOCATE PREPARE s1; 
        IF (@k IS NULL) THEN 
    
         PREPARE s2 FROM 'INSERT INTO Keywords (keyword) VALUES (?)'; 
         EXECUTE s2 USING @keyword; 
         DEALLOCATE PREPARE s2; 
    
         SELECT LAST_INSERT_ID() INTO @k; 
    
         PREPARE s3 FROM 'INSERT INTO ArticlesKeywords (article_id, keyword_id) 
         SELECT article_id, ? FROM Articles 
         WHERE title REGEXP CONCAT(''[[:<:]]'', ?, ''[[:>:]]'') 
          OR content REGEXP CONCAT(''[[:<:]]'', ?, ''[[:>]]'')'; 
         EXECUTE s3 USING @k, @keyword, @keyword; 
         DEALLOCATE PREPARE s3; 
    
        END IF; 
    
        PREPARE s4 FROM 'SELECT b.*FROM Articles b 
         JOIN ArticlesKeywords k USING (article_id) 
         WHERE k.keyword_id = ?'; 
        EXECUTE s4 USING @k; 
        DEALLOCATE PREPARE s4; 
    END 
    

    現在您可以使用此過程搜索關鍵字索引。

    CALL ArticlesSearch('OMG');

    的解決方案的最後一部分是確保每一個新的文章被自動索引:

    CREATE TRIGGER Articles_Insert AFTER INSERT ON Articles 
    FOR EACH ROW 
    BEGIN 
        INSERT INTO ArticlesKeywords (article_id, keyword_id) 
         SELECT NEW.article_id, k.keyword_id FROM Keywords k 
         WHERE NEW.content REGEXP CONCAT('[[:<:]]', k.keyword, '[[:>:]]') 
         OR NEW.title REGEXP CONCAT('[[:<:]]', k.keyword, '[[:>:]]'); 
    END 
    

    P.S.我從來沒有需要測試這種方法,這就是爲什麼我不能保證它會工作。

  • +0

    糾正我,如果我錯了,你必須事先定義關鍵字。嗯,這是否意味着沒有結果,如果我沒有連接文章與鍵入關鍵字。我是迴應維護關鍵字列表數據,是我? – Milos 2011-04-28 09:01:33

    +0

    是的,情況就是這樣。如果你想索引每篇文章中的每個單詞,你必須添加額外的腳本,它將所有*有用的*單詞,並將它們廣告索引,然後將文章本身保存在數據庫中。 – 2011-04-28 10:58:13

    +0

    嗯,這是不錯的選擇。誰需要索引文本中的每個單詞。根據結果​​頁面還有一個問題。 REsult頁面應該以表單頁面標題+匹配的內容。如何顯示與關鍵字匹配的文章的一部分。 – Milos 2011-04-28 12:28:09

    相關問題