跳到主要内容

全文检索与查询加速算子

本文介绍 Apache Doris 倒排索引支持的查询算子,包括两大类:

  • 全文检索算子:用于文本字段的关键词、短语、前缀、正则等模糊匹配场景。
  • 倒排索引查询加速:用于结构化字段的等值、范围、集合、数组等精确过滤场景。

全文检索算子

下表列出全部全文检索算子及其典型使用场景:

算子典型场景匹配规则
MATCH_ANY关键词「或」搜索命中任意一个关键词即可
MATCH_ALL关键词「与」搜索必须命中全部关键词
MATCH_PHRASE严格短语搜索词项相邻且顺序一致
MATCH_PHRASE(带 slop)容错短语搜索允许词项之间存在间隔
MATCH_PHRASE(严格顺序)固定词序的短语搜索间隔范围内词序固定
MATCH_PHRASE_PREFIX输入联想 / 前缀补全末词按前缀匹配
MATCH_REGEXP词项级正则匹配对分词结果应用正则
MATCH_PHRASE_EDGE多端模糊匹配首词后缀 + 中间精确 + 末词前缀

关键词搜索:MATCH_ANY / MATCH_ALL

适用于「输入若干关键词,查找包含这些词的文档」的场景。

  • MATCH_ANY:匹配包含任一关键词的行。

    SELECT * FROM table_name WHERE content MATCH_ANY 'keyword1 keyword2';
  • MATCH_ALL:匹配同时包含所有关键词的行。

    SELECT * FROM table_name WHERE content MATCH_ALL 'keyword1 keyword2';

短语搜索:MATCH_PHRASE 系列

适用于「关键词需相邻或保持词序」的精确短语匹配场景。

严格短语匹配

要求词项相邻且顺序一致。如需索引加速,请在索引属性中开启 "support_phrase" = "true"

SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2';

带 slop 的短语匹配

允许关键词之间存在最多 slop 个词的间隔,词序可不固定。

-- 允许 keyword1 与 keyword2 之间最多间隔 3 个词
SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3';

严格顺序的短语匹配

结合 + 与 slop,要求词序固定。

SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3+';

前缀与边缘匹配

适用于「输入联想」「前后缀模糊匹配」等场景。

MATCH_PHRASE_PREFIX

短语匹配,最后一个词按前缀匹配。当只给出一个词时,退化为该词的前缀匹配。

-- 最后一个词按前缀匹配
SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1 key';

-- 单词退化为前缀匹配
SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1';

MATCH_PHRASE_EDGE

边缘短语匹配,匹配规则如下:

  • 首词按后缀匹配
  • 中间词按精确匹配
  • 末词按前缀匹配
  • 词项之间需相邻
SELECT * FROM table_name WHERE content MATCH_PHRASE_EDGE 'search engine optim';

正则匹配:MATCH_REGEXP

针对分词后的词项进行正则匹配。

SELECT * FROM table_name WHERE content MATCH_REGEXP '^key_word.*';

使用 USING ANALYZER 指定分词器

当一个列上创建了多个使用不同分词器的倒排索引时,可以使用 USING ANALYZER 子句指定查询时使用哪个分词器。

语法

SELECT * FROM table_name WHERE column MATCH 'keywords' USING ANALYZER analyzer_name;

支持的算子

所有 MATCH 算子都支持 USING ANALYZER 子句:

  • MATCH / MATCH_ANY
  • MATCH_ALL
  • MATCH_PHRASE
  • MATCH_PHRASE_PREFIX
  • MATCH_PHRASE_EDGE
  • MATCH_REGEXP

内置分词器

名称说明
none精确匹配,不分词
standard标准分词
chinese中文分词

使用示例

-- 使用标准分词器(将文本分词)
SELECT * FROM articles WHERE content MATCH 'hello world' USING ANALYZER std_analyzer;

-- 使用关键词分词器(精确匹配,不分词)
SELECT * FROM articles WHERE content MATCH 'hello world' USING ANALYZER kw_analyzer;

-- 配合 MATCH_PHRASE 使用
SELECT * FROM articles WHERE content MATCH_PHRASE 'hello world' USING ANALYZER std_analyzer;

-- 使用内置分词器
SELECT * FROM articles WHERE content MATCH 'hello' USING ANALYZER standard;
SELECT * FROM articles WHERE content MATCH 'hello' USING ANALYZER none;

注意事项

  • 如果指定分词器的索引未构建,查询会自动降级到非索引路径(结果正确,但性能较慢)。
  • 如果未指定分词器,系统会使用任意可用的索引。

倒排索引查询加速

除全文检索外,倒排索引同样可加速结构化字段的精确过滤。支持的运算符与函数如下:

类别运算符 / 函数
等值与集合=!=INNOT IN
范围>>=<<=BETWEEN
空值判断IS NULLIS NOT NULL
数组array_containsarray_overlaps

使用示例:

-- 范围查询
SELECT * FROM t WHERE price >= 100 AND price < 200;

-- 集合查询
SELECT * FROM t WHERE tags IN ('a', 'b', 'c');

-- 数组查询
SELECT * FROM t WHERE array_contains(attributes, 'color');