feat: impl vector index query (#7564)

* feat: impl vector index query

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* feat: remove VectorSearchRule and merge it into scan hint rule

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* refactor: vector search hint

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* test: join and subquery

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* fix: clippy when feature disabled

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* fix: push hint only when column is non-nullable or an explicit IS NOT NULL filter exists

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* fix: transformed = true

Co-authored-by: Yingwen <realevenyag@gmail.com>
Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* chore: remove adpater vector hint

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* chore: revert transformed

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

---------

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>
Co-authored-by: Yingwen <realevenyag@gmail.com>
This commit is contained in:
dennis zhuang
2026-01-28 11:40:56 +08:00
committed by GitHub
parent 124478f577
commit 238bc4fa2c
13 changed files with 1208 additions and 16 deletions

View File

@@ -165,6 +165,8 @@ pub(crate) struct ScanMetricsSet {
rows_bloom_filtered: usize,
/// Number of rows filtered by vector index.
rows_vector_filtered: usize,
/// Number of rows selected by vector index.
rows_vector_selected: usize,
/// Number of rows filtered by precise filter.
rows_precise_filtered: usize,
/// Number of index result cache hits for fulltext index.
@@ -291,6 +293,7 @@ impl fmt::Debug for ScanMetricsSet {
rows_inverted_filtered,
rows_bloom_filtered,
rows_vector_filtered,
rows_vector_selected,
rows_precise_filtered,
fulltext_index_cache_hit,
fulltext_index_cache_miss,
@@ -384,6 +387,9 @@ impl fmt::Debug for ScanMetricsSet {
if *rows_vector_filtered > 0 {
write!(f, ", \"rows_vector_filtered\":{rows_vector_filtered}")?;
}
if *rows_vector_selected > 0 {
write!(f, ", \"rows_vector_selected\":{rows_vector_selected}")?;
}
if *rows_precise_filtered > 0 {
write!(f, ", \"rows_precise_filtered\":{rows_precise_filtered}")?;
}
@@ -600,6 +606,7 @@ impl ScanMetricsSet {
rows_inverted_filtered,
rows_bloom_filtered,
rows_vector_filtered,
rows_vector_selected,
rows_precise_filtered,
fulltext_index_cache_hit,
fulltext_index_cache_miss,
@@ -636,6 +643,7 @@ impl ScanMetricsSet {
self.rows_inverted_filtered += *rows_inverted_filtered;
self.rows_bloom_filtered += *rows_bloom_filtered;
self.rows_vector_filtered += *rows_vector_filtered;
self.rows_vector_selected += *rows_vector_selected;
self.rows_precise_filtered += *rows_precise_filtered;
self.fulltext_index_cache_hit += *fulltext_index_cache_hit;

View File

@@ -979,6 +979,7 @@ impl ParquetReaderBuilder {
return;
}
};
metrics.rows_vector_selected += selection.row_count();
apply_selection_and_update_metrics(output, &selection, metrics, INDEX_TYPE_VECTOR);
}
@@ -1229,6 +1230,8 @@ pub(crate) struct ReaderFilterMetrics {
pub(crate) rows_bloom_filtered: usize,
/// Number of rows filtered by vector index.
pub(crate) rows_vector_filtered: usize,
/// Number of rows selected by vector index.
pub(crate) rows_vector_selected: usize,
/// Number of rows filtered by precise filter.
pub(crate) rows_precise_filtered: usize,
@@ -1268,6 +1271,7 @@ impl ReaderFilterMetrics {
self.rows_inverted_filtered += other.rows_inverted_filtered;
self.rows_bloom_filtered += other.rows_bloom_filtered;
self.rows_vector_filtered += other.rows_vector_filtered;
self.rows_vector_selected += other.rows_vector_selected;
self.rows_precise_filtered += other.rows_precise_filtered;
self.fulltext_index_cache_hit += other.fulltext_index_cache_hit;