首先: - 我不能使用獅身人面像,因爲我使用共享主機 - 我不喜歡谷歌解決方案即。自定義搜索有這些愚蠢的廣告和網站搜索不是免費的php/mysql:自定義網站搜索
我想創建自己的搜索mechanizm。我有頁表,我想通過關鍵字搜索頁面內容,並且在結果頁上我想顯示與所需關鍵字匹配的文本的一部分(與谷歌相同)。
先進
首先: - 我不能使用獅身人面像,因爲我使用共享主機 - 我不喜歡谷歌解決方案即。自定義搜索有這些愚蠢的廣告和網站搜索不是免費的php/mysql:自定義網站搜索
我想創建自己的搜索mechanizm。我有頁表,我想通過關鍵字搜索頁面內容,並且在結果頁上我想顯示與所需關鍵字匹配的文本的一部分(與谷歌相同)。
先進
然後THX你有兩個(半)選擇:你想要搜索
下面是如何做的簡短版本第二選項:
假設您要搜索文章的內容。 基本上你必須創建一個你可能想要搜索的所有單詞的索引。
下面的代碼取自書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.我從來沒有需要測試這種方法,這就是爲什麼我不能保證它會工作。
糾正我,如果我錯了,你必須事先定義關鍵字。嗯,這是否意味着沒有結果,如果我沒有連接文章與鍵入關鍵字。我是迴應維護關鍵字列表數據,是我? – Milos 2011-04-28 09:01:33
是的,情況就是這樣。如果你想索引每篇文章中的每個單詞,你必須添加額外的腳本,它將所有*有用的*單詞,並將它們廣告索引,然後將文章本身保存在數據庫中。 – 2011-04-28 10:58:13
嗯,這是不錯的選擇。誰需要索引文本中的每個單詞。根據結果頁面還有一個問題。 REsult頁面應該以表單頁面標題+匹配的內容。如何顯示與關鍵字匹配的文章的一部分。 – Milos 2011-04-28 12:28:09
參考:[mySQL手冊:全文搜索功能](http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html) – 2011-04-27 23:02:21
可能重複[如何製作搜索引擎的網站?](http:// stackoverflow。問題/ 2810015 /如何使一個搜索引擎的網站) – 2011-04-27 23:03:01
我忘了noitce,我有alrady設置我的數據庫爲innoDB,所以我不能使用全文搜索。 – Milos 2011-04-28 09:04:02