2011-07-12 37 views
1

我在mysql中3個表內啓用全文搜索:MySQL的布爾搜索的權重列

標題(標題,URL),標題(標題,URL)和內容(內容URL)。

我的問題是這樣的:我想重比標題URL欄較多,標題欄比的標題多,比內容更標題。我能做到這一點用在需要每個學期布爾搜索,就像這樣:

SELECT * FROM title WHERE MATCH (title) 
AGAINST('+search' IN BOOLEAN MODE) 

回答

2

MATCH ...AGAINST返回一個數字,和MySQL記得where子句的結果,所以如果你有1臺3個獨立的FT-指標,你可能只是做一個:

SELECT * FROM tablename WHERE 
    MATCH (title) AGAINST('search') 
    OR MATCH (headings) AGAINST('search') 
    OR MATCH (content) AGAINST('search') 
ORDER BY 
    (MATCH (title) AGAINST('search') * 3) + 
    (MATCH (headings) AGAINST('search') * 2) + 
    MATCH (content) AGAINST('content') DESC 

或任何的權重可能需要。

或者,在布爾模式,同一個表,你可以使用:

SELECT * FROM tablename WHERE 
    MATCH (title) AGAINST('>>>search' IN BOOLEAN MODE) 
    OR MATCH (headings) AGAINST('>>search' IN BOOLEAN MODE) 
    OR MATCH (content) AGAINST('>search' IN BOOLEAN MODE) 
ORDER BY 
    MATCH (title) AGAINST('>>>search' IN BOOLEAN MODE) + 
    MATCH (headings) AGAINST('>>search' IN BOOLEAN MODE) + 
    MATCH (content) AGAINST('>search' IN BOOLEAN MODE) 

對於需要在搜索關鍵詞的搜索,同樣的技巧:

MATCH (title) AGAINST('+>>>search' IN BOOLEAN MODE) 

如果你有3個獨立的表,必須在某個地方存儲重量,無論是在某個JOIN中,還是通過單獨的查詢(但現在都是這樣):

SELECT *, MATCH (title) AGAINST('+>>>search' IN BOOLEAN MODE) as weight 
FROM title 
WHERE  MATCH (title) AGAINST('+>>>search' IN BOOLEAN MODE) 

SELECT *, MATCH (headings) AGAINST('+>>search' IN BOOLEAN MODE) as weight 
FROM headings 
WHERE  MATCH (headings) AGAINST('+>>search' IN BOOLEAN MODE) 

SELECT *, MATCH (content) AGAINST('+search' IN BOOLEAN MODE) as weight 
FROM content 
WHERE  MATCH (content) AGAINST('+search' IN BOOLEAN MODE) 
+0

利用工會是第三情況下(具有3個獨立的表)的方式 – re1man

+0

偉大的答案:)你在做和如何加入做什麼更好的辦法 – re1man

+0

也許,要看情況。在這種情況下,您很可能會想要使用第二個示例中的ORDER BY子句。 – Wrikken