2011-04-27 96 views
1

我想在我的MySQL表上使用全文搜索,但除此之外,我還想暗示某種「權重順序「用於執行搜索的列。根據「字段權重/順序」在我的MySQL表上進行全文搜索

例如:我有三列--CodeCol,TextCol,NoteCol。 當我搜索單詞「financial」時,它應該返回: 在ChapterCol(和/或TextCol,NoteCol)中包含此詞的所有行, ,然後是在TextCol中包含此詞的所有行(和/或NoteCol) 和最後所有隻有在NoteCol中才有的行。

我希望有一個答案...

感謝名單了很多

回答

1

首先,您需要使用MyISAM存儲引擎sicne它在MySQL中唯一一個支持FULLTEXT索引。

創建3個單獨的全文索引,其中每個索引都有一個。

在您的SELECT查詢中,對WHERE子句和ORDER BY子句中的3列中的每一列執行MATCH ... AGAINST ...,以便可以獲取至少包含一個搜索項的所有行的3列中,並根據哪個列包含搜索詞進行排序。

下面是一個例子:

CREATE TABLE IF NOT EXISTS your_table (
ChapterCol TEXT, 
TextCol TEXT, 
NoteCol TEXT, 
FULLTEXT INDEX (ChapterCol), 
FULLTEXT INDEX (TextCol), 
FULLTEXT INDEX (NoteCol) 
) Engine = MyISAM; 

-- insert test values 
insert into your_table (ChapterCol,TextCol,NoteCol) values ('foo','foo','foo'), 
('financial blah blah','foo','foo'),('foo','financial blah blah','foo'), 
('foo','foo','financial blah blah'),('financial blah blah','financial blah blah', 
'financial blah blah'); 

-- insert filler 
insert into your_table (ChapterCol,TextCol,NoteCol) 
values (md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())); 

SELECT ChapterCol,TextCol,NoteCol 
FROM your_table 
WHERE MATCH (ChapterCol) AGAINST ('financial' IN BOOLEAN MODE) 
OR MATCH (TextCol) AGAINST ('financial' IN BOOLEAN MODE) 
OR MATCH (NoteCol) AGAINST ('financial' IN BOOLEAN MODE) 
ORDER BY MATCH (ChapterCol) AGAINST ('financial' IN BOOLEAN MODE) DESC, 
MATCH (TextCol) AGAINST ('financial' IN BOOLEAN MODE) DESC, 
MATCH (NoteCol) AGAINST ('financial' IN BOOLEAN MODE) DESC; 
+0

關於訂單條款可能會更好給予匹配的別名爲更好的可讀性:'WHERE MATCH(TextCol)AGAINST(「金融」 IN BOOLEAN MODE)爲match_text' ...然後'ORDER BY match_text DESC ....' – acme 2011-11-02 10:59:32

+0

嗨,極致。您不能在'WHERE'子句中爲別名添加別名。你可以使用子查詢來替代select子句中的列,然後從外部select中排除這些列,但這會使查詢更長,並且你仍然需要複製'MATCH()'語句,你'd只是將第二個副本從'ORDER BY'移到SELECT'子句 – 2011-11-07 15:31:12

+0

啊你是對的 - 我沒有意識到它是在WHERE子句中,謝謝澄清! – acme 2011-11-07 16:34:42