You need to enable JavaScript to run this app.
导航
全文检索
最近更新时间:2024.08.15 14:29:07首次发布时间:2024.03.14 11:22:40

说明

当前高级功能仅对部分用户邀请开放,暂未全面开放,如有疑问请提交工单咨询。

全文检索(或仅文本搜索)提供了识别满足查询的自然语言文档的功能。最常见的搜索类型是查找包含给定查询词的所有文档。全文索引允许对文档进行预处理并保存索引以供以后快速搜索。我们通过增加文本倒排索引的能力,来支持更快速的文本检索和过滤的方式。
ByteHouse 企业版支持通过 SQL 语法来进行全文检索,本文将介绍如何创建全文索引并进行查询。

索引方式

目前全文检索支持根据两种文本分词索引方式:

  • 语言Token分词:Token分词以 空格标点符号 进行分词处理,通常适用于英语等有明显的以空格标点分词的语言种类。
  • Ngram分词:Ngram分词遇到 指定的字符(如 : 空白、标点)时分割文本,然后返回指定长度的每个单词的 N-grams。通常用于查询不使用空格或具有较长复合词的语言。

语法

基本语法

创建全文检索的基本语法举例如下,根据索引方式的不同,我们需要为inverted()中设置不同的值。

CREATE TABLE tab
(
    `key` UInt64,
    `str` String,
    INDEX inv_idx(str) TYPE inverted(0) GRANULARITY 1
)
ENGINE = MergeTree
ORDER BY key
SETTINGS index_granularity = 1024;

Token分词

设置inverted(0)或者inverted()时,分词器将设置为“tokens”,即沿空格分割字符串。

CREATE TABLE test_inverted_with_token
(
    `key` UInt64,
    `doc` String,
    -- low(doc) 只将 英文字母 转换为 小写后进行文本处理 --
    -- 在不特殊指定时默认采用 Token 进行分词 --
    INDEX doc_idx lower(doc) TYPE inverted GRANULARITY 1 
)
ENGINE = MergeTree()
ORDER BY key
SETTINGS index_granularity = 1024;

Ngram分词

设置为inverted(N) 时,即是使用 N-gram 分词器,范围为[ 2 , 8 ]。
Ngram 分词遇到指定的字符(如 : 空白、标点)时分割文本,然后返回指定长度的每个单词的 N-grams。通常用于查询不使用空格或具有较长复合词的语言。

CREATE TABLE test_inverted_with_ngram
(
    `key` UInt64,
    `doc` String,
    -- low(doc) 只将 英文字母 转换为 小写后进行文本处理 --
    -- 指定数字 N 代表采用 N-gram 对文本分词 --
    INDEX doc_idx lower(doc) TYPE inverted(4) GRANULARITY 1
)
ENGINE = MergeTree()
ORDER BY key
SETTINGS index_granularity = 1024;

复杂定义方式

  1. 支持自定义分割符的方式。
-- 将按照seperators里包含的所有字符进行分割
-- 如下会根据 , 和 ; 分割
INDEX doc_idx doc TYPE inverted('char_sep','{"seperators": ",;"}') GRANULARITY 1
  1. 原有token/ ngram 分词方式。
-- token 分词
INDEX doc_idx doc TYPE inverted('token','{}') GRANULARITY 1
INDEX doc_idx doc TYPE inverted('token','{"density": 1.0}') GRANULARITY 1
-- 3 n-gram 分词
INDEX doc_idx doc TYPE inverted('ngram','{ "ngrams": 3}') GRANULARITY 1
INDEX doc_idx doc TYPE inverted('ngram','{ "ngrams": 3, "density": 1.0}') GRANULARITY 1

查询函数

String类型

函数名

描述

equals

检查字段值是否等于指定值。

notEquals

检查字段值是否不等于指定值。

like

检查字段值是否匹配指定模式。

notLike

检查字段值是否不匹配指定模式。

hasToken

检查字段值是否包含指定令牌。

startsWith

检查字段值是否以指定前缀开头。

endsWith

检查字段值是否以指定后缀结尾。

multiSearchany

对字段的任意值使用指定的搜索词进行多搜索。

notIn

检查字段值是否不在指定值列表中。

in

检查字段值是否在指定值列表中。

hasTokenBySeperator(column_name, value_literal, seperator)

检查column_name列在按照seperator分隔后是否有有某个值value_literal的存在

Array String 类型

函数名

功能描述

has

判断一个元素是否在给定的数组或集合中

hasAny

判断给定的数组或集合中是否至少有一个元素满足指定的条件

arraySetCheck

检查一个数组或集合是否满足指定的条件