mysql的全文索引

全文索引使用倒排索引(inverted index)的方式,将字段中的内容进行分词,存储分词与自身所在位置的映射,从而加快查询效率。

创建索引

CREATE FULLTEXT INDEX full_index_name ON table_name(col_name) [WITH PARSER ngram];

注意,如果该字段中的内容是中文,一定要使用 WITH PARSER ngram 指定 N-gram 分词插件

假如使用navicat创建索引,为了保证中文可用,需要指定解析器:

基本语法

自然语言搜索

-- 查询head,content列中包含“科技”的结果
SELECT
	*
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( '科技' );
-- 查询相关性
SELECT
    id,head,content,
    MATCH ( head, content ) AGAINST ( '理想' )
FROM
    pre_article;

 需要注意的是,包含在stopword里面的关键词是检索不出来的

-- 查看mysql内置的stopword
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;

使用中文的自然语言搜索,在搜索关键词是英文的时候,通常会发生一些莫名其妙的问题,将不该被搜索到的信息搜索出来。

布尔搜索

包括特殊的查询语言规则,默认用法如下:

SELECT
	id,head,content
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( '科技'  IN BOOLEAN MODE);
	

1. + 表示某个关键词必须存在

SELECT
	id,head,content
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( '+科技'  IN BOOLEAN MODE);
	

2. - 表示关键词必须不存在

-- 包含科技但不包含文物,注意中间的空格
SELECT
	id,head,content
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( '+科技 -文物'  IN BOOLEAN MODE);
	

3. 没有操作符

-- 表示包含“科技”或者“文物”
SELECT
	id,head,content
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( '科技 文物'  IN BOOLEAN MODE);
	

4. * 表示已关键词开头

-- 这通常用在英文的查询中
SELECT
	id,head,content
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( 'sec*'  IN BOOLEAN MODE);
	

5. ""表示短语

SELECT
	id,head,content
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( '"高考数学"'  IN BOOLEAN MODE);

查询扩展搜索

通常用在查询词太短,进行一次查询后,根据第一查询结果产生的分词进行第二次查询。请谨慎使用。

SELECT
	id,head,content
FROM
	`pre_article` 
WHERE
	MATCH ( head, content ) AGAINST ( '科技' WITH QUERY expansion);
	

 

posted @ 2022-08-10 11:21  Bin_x  阅读(420)  评论(0)    收藏  举报