MySQL组合查询,全文本搜索
- 使用UNION进行组合查询:举一个例子,假如需要价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品(不考虑价格)。当然,可以利用WHERE子句来完成此工作,不过这次我们将使用UNION。如果用where语句,则为:
select vend_id, prod_id, prod_price from products where prod_price <=5 or vend_id in (1001, 1002);
用UNION则为:select vend_id, prod_id, prod_price from products where prod_price <=5 UNION select vend_id, prod_id, prod_price from products where vend_id in (1001, 1002);
其中会去掉重复的行,如果不去掉重复的行,则使用 UNION ALL - 全文本搜索:
select note_text from productnotes where match(note_text) against('rabbit');
此语句也可以用like完成:select note_text from productnotes where note_text like '%rabbit%';
全文本搜索排序(包含词rabbit作为第3个词的行的等级比作为第20个词的行高):select note_text match(note_text) against('rabbit') AS rank from productnotes;
- 查询扩展:
select note_text from productnotes where match(note_text) against('anvils' with query expansion);
(这次返回了7行。第一行包含词anvils,因此等级最高。第二行与anvils无关,但因为它包含第一行中的两个词(customer 和recommend),所以也被检索出来。第3行也包含这两个相同的词,但它 们在文本中的位置更靠后且分开得更远,因此也包含这一行,但等级为 第三。第三行确实也没有涉及anvils(按它们的产品名)) - 布尔文本搜索:
select note_text from productnotes where match(note_text) against('heavy -rope*' in boolean mode);
(这次只返回一行。这一次仍然匹配词heavy,但-rope明确地指示MySQL排除包含rope(任何以rope开始的词,包括ropes的行))
全文本布尔操作符:
布尔操作符 | 说明 |
---|---|
+ | 包含,词必须存在 |
- | 排除,词必须不出现 |
> | 包含,而且增加等级值 |
< | 包含,且减少等级值 |
() | 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等) |
˜ | 取消一个词的排序值 |
* | 词尾的通配符 |
“” | 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) |