MySQL全文本搜索引擎与触发器
来源:互联网 发布:我的世界无限耐久js 编辑:程序博客网 时间:2024/04/30 10:40
前言: MySQL 支技多种索引Index:主键,唯一索引(一个表可以有多个唯一索引,但必须只能有一个主键),普通索引(当大量的搜索是关于一个表的一列或几列时),全文本索引(以下重点阐述),聚族索引(一个表只能有一个,它们的顺序就是数据的物理顺序,不宜常更新!)。
一、mysql最常使用的搜索引擎为MyISAM(全文本搜索引擎)和InnoDB(可靠的事务处理引擎) ,前者支持全文本搜索且查询速度更快一些,后者不支持全文本搜索引擎。
二、全文本搜索有比LIKE匹配和正则表达式匹配更强的功能,在对表进行全文本搜索时,MySQL不需要分表查看每个行,不需要分别分析和处理每个词。 MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样,MySQL可以有效的决定哪些词匹配(哪些行包含他们),哪些词不匹配,他们的匹配频率,等等。
三、为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断的重新索引。在对表列进行适当设计后,MySQL会自动进行所有的索引和重新索引。在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。
例如:select id,web_name,match(col1,col2) Against('XXXX') from table A; 比较的是col1与col2的相似度,处于[0,1]之间,这里有一些是需要注意的:
1. ‘XXXX’必须要>=4个字符。
2. 'the', 'some' 这些是整用词,因为常用,所以不能用于'XXXX'当中。
3. 如果有XX"XX,会被认为是两个字符串。
四、一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。
CREATE
(
在使用索引之前,必须要建立索引,且索引的类型要是vchar,char,string类型,如果不是MyISAM类型的索引,可以通过以下方法进行转换:
Alter table table_name Engine=MyISAM;
五、 在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()制定被搜索的列,Against()
select note_text from productnotes where match(note_text) against('hello');
注意:1。传递给Match()的值必须与FULLTEXT()定义的相同。如果指定多个列,则必须列出它们且次序正确。2.
试一下这个语句:select note_text,MATCH(note_text) Against as rank from productnotes
六、使用查询扩展,能找出可能相关的结果,即使他们并不精确包含所要查找的词。
select note_text from productnotes where match(note_text) against('hello' with QUERY EXPANSION) .
可以看出,只有第一行包含词anvils,因此等级最高。第二行与词anvils无关,但因为它包含第一行中的两个词(customer和recommend),所以也被检索出来,第三行业包含相同的词,但他们,他们文本中的位置更靠后且分开的更远,所以排在第三。
七、MySQL同时还支持布尔方式(boolean mode)。
可以支持以下细节:要匹配的词;要排斥的词;排列提示;表达式分组;其他。
布尔文本搜索在没有建立索引的情况下也能使用,但速度会变得非常缓慢。
全文本布尔搜索操作符
>
<
()
~
*
""
举例:
SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('+rabbit +bait' IN BOOLEAN MODE)
SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('rabbit bait' IN BOOLEAN MODE)
SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('"rabbit bait"' IN BOOLEAN MODE)
SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('>rabbit <carrot"' IN BOOLEAN MODE)
SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);
触发器:
分为事前触发器与事后触发器。
■建立触发器:
create trigger all_reassign before/after insert or update on table_name
for each row
AS BEGIN
IF(new.job='教授') and new.sal<4000 THEN
new.sal=5000;
END IF;
END;
■删除触发器:
Drop trigger all_reassign on table_name;
在一个表上可以建立多个触发器,它们的顺序按照before 与after进行,如果有多个同类触发器,则按照顺序进行触发。
- MySQL全文本搜索引擎与触发器
- Java 全文本搜索引擎工具
- MySQL FULLTEXT全文搜索引擎
- MySQL全文搜索引擎mysqlcft
- mysql全文本搜索
- Mysql 全文本检索
- mysql 全文本索引
- Java技术开源全文本搜索引擎
- sphinx(斯芬克斯)mysql全文搜索引擎
- MySQL的全文本搜索
- 全文本搜索 (For MySQL)
- MySQL全文本搜索Hello
- mysql 触发器更新本表
- mysql 更新本表触发器
- 使用solr为mysql构建全文搜索引擎
- 使用solr为mysql构建全文搜索引擎
- 全文搜索引擎
- 关于Mysql的全文本搜索功能
- [computer]笔记本键盘按下字母输出数字问题解决
- 16/7/2012 ICPC培训 第一天
- hdu 3487 Play with Chain
- mongoose中的map reduce和group by
- android-导入Android工程时出错
- MySQL全文本搜索引擎与触发器
- HreoWinGauge2.0组件集应用示例----LED多段指示器(2)
- J2ME中的drawString()方法技巧
- NSNotification的用法
- 【转】LINUX 下找回 root 密码(精)
- ACE在Linux 编译
- 关于百度地图的坐标纠偏
- java实现栈,队列数据结构
- uva 10344 - 23 out of 5