2011-04-27 93 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