2011-07-21 80 views
1

搜索我想要寫在MySQL基於標籤的搜索引擎,但我真的不知道怎麼去愉快的結果。標籤與MySQL

我以前很喜歡,但我保存時間超過18K的關鍵詞在數據庫中,這是相當緩慢的。

我有什麼是像這樣的表:

ID(INT,主鍵)article_cloud(文本)的關鍵字(VARCHAR(40),全文索引)

所以我店每行一個關鍵字和將所有參考文章編號保存在article_cloud中。

我試過AGAINST()的東西,這很好,只要工作在整個關鍵字的用戶類型匹配()。但我也想要一個建議搜索,以便在用戶打字時彈出相關文章。所以我仍然需要給LIKE一個類似的聲明,但速度更快。我不知道我能做什麼。

也許這是基於標籤搜索的錯誤概念。如果你知道一個更好的,請告訴我。我爲此奮鬥了幾天,無法找到令人滿意的解決方案。感謝您的閱讀:)

回答

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','to','是','和','他'...)。

+0

因爲它是一個樂器商店,所以有很多關鍵詞指的是大量的文章。我會嘗試,但事實是,我不知道關鍵字表格會變得多大。現在我節省了大約18k個關鍵字。如果我像你寫的那樣構造它,它可能會變成4到5倍大。但感謝這個想法,我肯定會給它一個,也許它比我的作品更好 –

+0

第三次閱讀你的文章後,它變得越來越有意義。非常感謝您的幫助! –

+0

我實現了它,它的速度有多快。從來沒有想過。非常感謝! –

0

我試過匹配()反對()的東西,只要用戶鍵入整個關鍵字,它工作得很好。

你覺得這是什麼意思FULLTEXT?

我在我的表40 000項,不使用索引(本地使用),並搜索最大0.1秒,LIKE '%SOMETHING%'

您可能LIMIT您的查詢輸出

+0

我知道全文意味着什麼。正如我所說,它工作正常,但它不是我想要的。我做了限制到11,但它仍然需要約0.5-0.9秒,這太慢了。 –

+0

只需在LIIT中使用LIKE'%%'即可。或者嘗試一下[sphinx](http://sphinxsearch.com/),但是我的經驗不好 – genesis