[Feature] Support full-text search modes for unindexed row ranges
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 35/100
Piste de recherche
Start by reviewing the Java design references for DataEvolutionGlobalIndexCoverage and RawFullTextReadImpl, then inspect the C++ full-text search entry points after dependencies #404 and #405. Verify the four options and resolution order, raw-range handling, and in-memory temporary index behavior with tests for appended rows, partial coverage, deletion vectors, and row filters.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Search before asking
- I searched in the issues and found nothing similar.
Motivation
Sub-issue of #399 (step 4: search modes).
In Paimon C++, a full-text search only sees rows covered by a full-text index. Rows appended after the last index build are invisible. Java controls this with full-text-index.search-mode, which falls back to global-index.search-mode. In full and detail modes, Java also searches row ranges that have no full-text index yet: it reads the raw rows and builds a temporary index (apache/paimon#8316, apache/paimon#8844).
Java options (CoreOptions):
| Key | Default | Description |
|---|---|---|
global-index.search-mode |
(none) | Fallback search mode for global index queries. |
scalar-index.search-mode |
fast (apache/paimon#8891) |
Search mode for scalar index queries. |
vector-index.search-mode |
fast |
Search mode for vector index queries. |
full-text-index.search-mode |
fast |
Search mode for full-text index queries. |
Values:
fast: search indexed data only.full: use the snapshot's next row id and the global index coverage to find missing row ids, and scan raw data only when a gap exists.detail: scan data files to find the exact unindexed rows.
Resolution order: an explicitly set family key wins, then global-index.search-mode, then the family default.
Java design:
-
Coverage.
DataEvolutionGlobalIndexCoverage#unindexedRanges(fieldIds, ...)computes the gaps:fast: none. The same applies when the snapshot'snextRowIdis null or not positive.full:[0, nextRowId - 1]minus the indexed ranges.detail: the non-null row-id ranges of all data files (aScanMode.ALLread that respects the partition filter), minus the indexed ranges.- Indexed ranges are intersected across the requested fields. Both
index_field_idandextra_field_idscount as coverage.
-
Scan. When at least one full-text index file exists and the unindexed ranges are non-empty, the scan adds a
RawFullTextSearchSplit(rowRanges). With no full-text index at all, the result is empty even infullmode. -
Read.
RawFullTextReadImplhandles the raw split:- Read the column plus
_ROW_IDfor the raw ranges, pinned to the plan snapshot. The read respects deletion vectors, and the row filter is applied to build the include set. - Build a temporary in-memory index with the column's index type and options, writing
(text, rowId - first.from). - Search it with the same query and limit.
- Replace indexed hits that fall inside the raw ranges with the raw hits.
- Apply the final top-k.
The temporary index's statistics come from the raw rows only.
- Read the column plus
Solution
- Add the four options and the family-specific resolution.
- Port the coverage computation,
RawFullTextSearchSplit, and the raw read path with the temporary index. The temporary index should be written to and read from memory, without touching table storage. - Use
scalar-index.search-modefor row-filter coverage in #405. - Add tests:
- rows appended after the index build, in
fast,fullanddetailmodes - partial index coverage across partitions
- deletion vectors inside raw ranges
- a row filter on the raw path
- rows appended after the index build, in
Anything else?
- Depends on #404. The raw path supports row filters once #405 lands.
- Java primary-key full-text search supports only
fastand rejects the other modes; see #410.
Are you willing to submit a PR?
- I'm willing to submit a PR!
- Langage dominant
- C++
- Étoiles
- 65
- Forks
- 31
- Merge moyen
- 1 j 14 h
- PR mergées (30 j)
- 60
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/paimon-cpp
-
[Feature] Warm up next data file in ConcatBatchReaderPeut-être pris @SteNicholas l’a pris il y a 3 jours. Ouverteenhancement
apache/paimon-cpp#419 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[Feature] Derive Parquet data file stats from in-memory writer metadata instead of re-reading footerPeut-être pris @SteNicholas l’a pris il y a 3 jours. Ouverteenhancement
apache/paimon-cpp#417 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[Feature] Support writing MAP<K, BLOB> fieldsPeut-être pris @SteNicholas l’a pris il y a 6 jours. Ouverteenhancement
apache/paimon-cpp#415 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
apache/paimon-cpp#410 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
apache/paimon-cpp#409 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/paimon-cpp
Issues similaires
-
needs-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
flashinfer-ai/flashinfer#6212 ·
Les mainteneurs répondent en général sous 1 jour
-
bug graphics
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
FlaxEngine/FlaxEngine#4295 · 2 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
Algorithmiq/monoprop#390 ·
Les mainteneurs répondent en général sous 1 jour
-
docs
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
leethomason/tinyxml2#1097 ·