Skip to Content

全文检索和倒排索引

全文检索

语法

CREATE TABLE table_name(
    column_list,
    ...,
    FULLTEXT (column1,column2,..)
);

ALTER TABLE table_name  
ADD FULLTEXT(column_name1, column_name2,…)

CREATE FULLTEXT INDEX index_name
ON table_name(idx_column_name,...)
select * from book
where
	match(name, author, publisher) -- 想要匹配的column列表,需要和创建index时候的column列表一致:列名和个数要一样(顺序可以不一样),不然sql会报错。
    against('北京日报') -- 关键字

倒排索引

原理

普通的模糊查询,从文档里找出关键字

而倒排索引相反,根据关键字找文档,是提前记录了关键字出现在哪些文档里,再进行查找

流程

1. 分词

将每个文档划分为词项(单词或短语),忽略常见的停用词(例如"the", "and", "over")。

文档1:quick, brown, fox

文档2:jumped, lazy, dog

文档3:fox, dog, played

2. 为每个词项建立索引: 对于每个词项,记录它在哪些文档中出现。

quick: 文档1

brown: 文档1

fox: 文档1, 文档3

jumped: 文档2

lazy: 文档2

dog: 文档2, 文档3

played: 文档3

3. 为了支持更高级的搜索和排序,可以记录词项在文档中的位置和权重。

quick: 文档1 (位置: 1, 权重: 1)

brown: 文档1 (位置: 2, 权重: 1)

fox: 文档1 (位置: 3, 权重: 1), 文档3 (位置: 1, 权重: 1)

jumped: 文档2 (位置: 1, 权重: 1)

lazy: 文档2 (位置: 2, 权重: 1)

dog: 文档2 (位置: 3, 权重: 1), 文档3 (位置: 2, 权重: 1)

played: 文档3 (位置: 3, 权重: 1)

4. 搜索:

当用户执行搜索查询时,查询的词项会在倒排索引中查找,返回包含这些词项的文档。例如,如果用户搜索 "brown fox",倒排索引会返回包含这两个词的文档,即文档1。

三范式