码迷,mamicode.com
首页 > 其他好文 > 详细

全文索引

时间:2015-09-13 02:03:57      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

全文索引

全文索引

Table of Contents

alter table TABLE_NAME add fulltext (COLUMN)
drop table if exists articles;
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
);

INSERT INTO articles (title,body) VALUES
(‘MySQL Tutorial‘,‘DBMS stands for DataBase ...‘),
(‘How To Use MySQL Well‘,‘After you went through a ...‘),
(‘Optimizing MySQL‘,‘In this tutorial we will show ...‘),
(‘1001 MySQL Tricks‘,‘1. Never run mysqld as root. 2. ...‘),
(‘MySQL vs. YourSQL‘,‘In the following database comparison ...‘),
(‘MySQL Security‘,‘When configured properly, MySQL ...‘);


SELECT * FROM articles
WHERE MATCH (title,body) AGAINST (‘database‘);
SELECT id, body, MATCH (title,body) AGAINST
(‘Security implications of running MySQL as root‘) AS score
FROM articles WHERE MATCH (title,body) AGAINST
(‘Security implications of running MySQL as‘);

一些规则:

aaa‘bbb 会被视为一个单词, 而 aaa‘‘bbb 则被视为 2 个单词
‘aaa‘bbb‘ 会变成 aaa‘bbb
任何过于短的词都会被忽略, 全文搜索所能找到的词的默认最小长度为 4 个字符
*停止字* 中的词会被忽略, 禁用词就是一个像 "the" 或 "some" 这样过于平常而被认为是不具语义的词

系统自变量规定了被编入索引单词的最小长度和最大长度

mysql> show variables like ‘ft_min_word_len‘;
mysql> show variables like ‘ft_max_word_len‘;

如果单词 "MySQL"出现在至少全文的 50%的行中, 它被列入停止字, 那么搜索的结果为空 (好像不支持, 我的版本 MariaDB-10.0.21 ..)


boolean 模式

SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘MySQL‘);
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘MySQL YourSQL‘);
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘+MySQL -YourSQL‘);
SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘+MySQL -YourSQL‘ IN BOOLEAN MODE);

SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘MySQL‘);

全文索引按相关性排序 (如果没有开启 boolean 模式)
开启后

  1. 它们不使用 50% 域值
  2. 它们不会按照相关性渐弱的顺序将行进行分类
  3. 即使没有 FULLTEXT, 它们仍然可以工作, 尽管这种方式的搜索执行的速度非常之慢
  4. 最小单词长度全文参数和最大单词长度全文参数均适用
  5. 停止字适用
+ 该单词必须出现
- 该单词必须不出现
  该单词可有可无,但含有该单词的行等级较高。这和 MATCH() … AGAINST()不使用 IN BOOLEAN MODE 修改程序时的运作很类似
> < 这两个操作符用来改变一个单词对赋予某一行的相关值的影响. > 操作符增强其影响, 而 < 操作符则减弱其影响
( ) 括号用来将单词分成子表达式. 括入括号的部分可以被嵌套
~ 否定符, 用来否定单词对该行相关性的影响. 对标记 noise(无用信息) 的单词很有用. 包含这类单词的行较其它行等级低, 但因其可能会和-号同时使用
* 星号用作截断符. 于其它符号不同的是, 它应当被追加到要截断的词上
" 非单词字符不需要严密的匹配, 例如, "test phrase" 符合 "test, phrase"

‘apple banana‘: 寻找包含至少两个单词中的一个的行
‘+apple +juice‘: 寻找两个单词都包含的行
‘+apple macintosh‘: 寻找包含单词 "apple" 的行, 若这些行也包含单词 "macintosh", 则列为更高等级
‘+apple -macintosh‘: 寻找包含单词 "apple" 但不包含单词 "macintosh"的行
‘+apple +(>turnover <strudel)‘: 寻找包含单词 "apple" 和 "turnover" 的行, 或包含 "apple" 和 "strudel" 的行 (无先后顺序), 然而包含  "apple turnover" 的行较包含 "apple strudel" 的行排列等级更为高
‘apple*‘: 寻找包含 "apple" , "apples", "applesauce" 或 "applet" 的行
‘"some words"‘: 寻找包含原短语 "some words" 的行 (例如, 包含 "some words of wisdom" 的行, 而非包含 "some noise words" 的行) 注意包围词组的 ‘"’ 符号是界定短语的操作符字符. 它们不是包围搜索字符串本身的引号

TODO 中文全文索引 sphinx

全文索引

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4803969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!