Doris 4.0.5 倒排索引使用ngram分词,查询长字符串性能差的问题

Viewed 56

创建表索引
CREATE inverted index tokenizer if not exists ngram3_tokenizer
properties (
"type"="ngram",
"min_gram" = "3",
"max_gram" = "3"
);

CREATE inverted index analyzer if not exists ngram3_analyzer
properties (
"tokenizer" = "ngram3_tokenizer",
"token_filter" = "lowercase"
);

**创建表时指定的索引如下
**INDEX inv_URL (URL) USING INVERTED PROPERTIES( "analyzer"="ngram3_analyzer", "support_phrase"="true" )

查询SQL

select url
from t1
where search('url:"https://doris.apache.org/zh-CN/docs/3.x/query-acceleration/materialized-view/async-materialized-view/functions-and-demands/"')
and time > (7天前) and time < 当前

7天内的查询,长字符查询非常慢

如果是换成较短的字符串的话就快很多,如下面的SQL
select url
from t1
where search('url:"doris.apache.org"') and time > (7天前) and time < 当前

select url
from t1
where search('url:"apache"') and time > (7天前) and time < 当前

字符串很短就会非常快

用户也会有查询三个字符的情况,比如pwd这样的需求

请问该如何优化?

2 Answers

这个现象大概率不是单点 bug,而是 3-gram analyzer 与长字符串 PHRASE 查询组合后的性能放大。search('url:"long url"') 会按短语查询处理,查询串会先按索引 analyzer 分词;3-gram
下长 URL 会拆出大量相邻 token,查询需要对这些 token 的倒排链和 position 做顺序匹配。短字符串 token 少,所以快。
如果是精确 URL 查询,优先用 url = '...',并结合分区/排序键/非分词倒排索引验证 profile。
如果是 URL/路径检索,建议用 TOKENIZE 对比 ngram、english、standard、basic 或自定义 analyzer 的分词效果。对 /pwd/ 这类路径段查询,按分隔符分词通常比 3-gram 更合适;但如果
需求是任意子串包含,仍需要 ngram 或 NGram BloomFilter/LIKE 这类方案。

我懂这种方式。我是觉得,你先看看你要查询的字符串,被分词后的长度。感觉如果长度过长,我感觉就很有问题了。