Skip to content

全文检索快速开始

本文以日志检索为例,演示如何在 Datalayers 中为 STRING 列创建倒排索引,并使用 MATCHQUERYSCORE() 完成基础全文检索。

示例中的 message 列存放英文日志内容,因此索引配置采用 standard 分词器;如果你的日志以中文为主,建议改用 tokenizer='chinese'

1. 创建表

首先创建一张用于存放日志的示例表,其中 message 为待检索字段:

SQL
CREATE TABLE logs (
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  service STRING,
  level STRING,
  message STRING,
  timestamp key(ts)
)
PARTITION BY HASH(service) PARTITIONS 1;

2. 创建倒排索引

message 列上创建倒排索引:

SQL
CREATE INVERTED INDEX idx_message ON logs (message)
WITH (tokenizer='standard', filters='lowercase,english_stop', with_position='true');

索引参数说明:

  • tokenizer='standard':适合英文文本,按空格和标点进行分词
  • filters='lowercase,english_stop':统一大小写并过滤常见英文停用词
  • with_position='true':保存词位置信息,便于短语检索和更准确的相关性排序

3. 为历史数据补建索引(可选)

如果 idx_message 创建前表中已经存在历史数据,需要执行一次索引刷新,将存量数据纳入倒排索引:

SQL
REFRESH INDEX idx_message ON logs;

4. 执行全文检索

MATCH 适合直接按关键词或多个词项进行检索:

SQL
SELECT ts, service, level, message
FROM logs
WHERE MATCH('message', 'database timeout')
ORDER BY SCORE() DESC
LIMIT 20;

QUERY 适合表达短语匹配、布尔逻辑或集合匹配:

SQL
SELECT ts, service, level, message
FROM logs
WHERE QUERY('message:"connection refused" OR message:in [timeout retry]')
ORDER BY SCORE() DESC
LIMIT 20;

查询说明:

  • MATCHQUERY 只能出现在 WHERE 子句中
  • SCORE() 必须与全文检索函数一起使用
  • ORDER BY SCORE() DESC 可让最相关的结果排在前面

5. 删除索引(可选)

如果需要清理测试环境中的索引,可执行:

SQL
DROP INDEX idx_message ON logs;

相关文档