首先,您需要使用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;
关于订单条款可能会更好给予匹配的别名为更好的可读性:'WHERE MATCH(TextCol)AGAINST(“金融” IN BOOLEAN MODE)为match_text' ...然后'ORDER BY match_text DESC ....' – acme 2011-11-02 10:59:32
嗨,极致。您不能在'WHERE'子句中为别名添加别名。你可以使用子查询来替代select子句中的列,然后从外部select中排除这些列,但这会使查询更长,并且你仍然需要复制'MATCH()'语句,你'd只是将第二个副本从'ORDER BY'移到SELECT'子句 – 2011-11-07 15:31:12
啊你是对的 - 我没有意识到它是在WHERE子句中,谢谢澄清! – acme 2011-11-07 16:34:42