Skip to content

#3220 fulltext index improvements#3221

Merged
robfrank merged 45 commits intomainfrom
feat/improve-fulltext
Jan 26, 2026
Merged

#3220 fulltext index improvements#3221
robfrank merged 45 commits intomainfrom
feat/improve-fulltext

Conversation

@robfrank
Copy link
Collaborator

No description provided.

@robfrank robfrank linked an issue Jan 24, 2026 that may be closed by this pull request
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @robfrank, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly upgrades ArcadeDB's full-text indexing capabilities, moving beyond basic text search to offer advanced features comparable to dedicated search engines. It introduces granular control over Lucene analyzers, supports complex Lucene query syntax, and enables multi-property indexing. Furthermore, it provides new SQL functions for flexible querying and exposes relevance scores directly within SQL results, empowering users to build more sophisticated search functionalities.

Highlights

  • Configurable Full-Text Indexes: Introduced FullTextIndexMetadata and TypeFullTextIndexBuilder to allow detailed configuration of Lucene analyzers (default, index-specific, query-specific, per-field), leading wildcards, and default boolean operators via METADATA clause in CREATE INDEX statements.
  • Multi-Property Full-Text Indexing: Enhanced LSMTreeFullTextIndex to support indexing multiple properties within a single full-text index, storing tokens with field prefixes for field-specific searches.
  • Advanced Lucene Query Syntax: Implemented FullTextQueryExecutor to parse and execute Lucene query syntax (boolean operators, phrase queries, wildcards, field-specific queries) against the full-text index.
  • New SQL Search Functions: Added SEARCH_INDEX(indexName, query) and SEARCH_FIELDS(fieldNames, query) SQL functions, enabling direct Lucene-style queries against full-text indexes and automatic index resolution for SEARCH_FIELDS.
  • SQL Score Exposure: Integrated $score as a special projection variable in SQL queries, allowing users to retrieve and order results by relevance score from full-text searches.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@mergify
Copy link
Contributor

mergify bot commented Jan 24, 2026

🧪 CI Insights

Here's what we observed from your CI run for ac30be5.

🟢 All jobs passed!

But CI Insights is watching 👀

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces significant enhancements to ArcadeDB's full-text indexing capabilities, including configurable analyzers, Lucene query syntax support, new search functions (SEARCH_INDEX, SEARCH_FIELDS), multi-property index support, and score exposure ($score). The changes are extensive and well-structured, following a detailed design and implementation plan. I've identified a critical issue in the boolean query logic within the new FullTextQueryExecutor, a high-severity issue related to how TypeIndex handles sharded full-text searches, and a couple of medium-severity maintainability improvements. Overall, this is a great addition, but the identified correctness issues should be addressed before merging.

Comment on lines 176 to 186
} else if (clause.occur() == BooleanClause.Occur.SHOULD) {
collectMatches(clause.query(), scoreMap, excluded);
}
}

if (mustResults != null) {
for (final Map.Entry<RID, AtomicInteger> entry : mustResults.entrySet()) {
scoreMap.computeIfAbsent(entry.getKey(), k -> new AtomicInteger(0))
.addAndGet(entry.getValue().get());
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

The logic for handling boolean queries with both MUST and SHOULD clauses appears to be incorrect. Currently, results from SHOULD clauses are added to scoreMap, and then results from MUST clauses are also added. This effectively performs a UNION between MUST and SHOULD results.

The correct behavior for a query like +term1 term2 (where term1 is MUST and term2 is SHOULD) is that documents must contain term1, and documents that also contain term2 get a higher score. The current implementation would return documents containing just term2, which is incorrect.

To fix this, if mustResults is not null (meaning there were MUST clauses), the scoreMap (containing SHOULD results) should be filtered to retain only the documents present in mustResults before merging the scores.

Comment on lines +698 to +704
if (k.contains(":")) {
// Field-specific search
rids = underlyingIndex.get(new String[] { k });
} else {
// Unqualified search - search without prefix
rids = underlyingIndex.get(new String[] { k });
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The logic for get() in this part of the implementation plan appears to have a copy-paste error. Both the if and else branches for k.contains(":") execute the same code: rids = underlyingIndex.get(new String[] { k });. This seems incorrect for handling field-qualified searches versus unqualified searches.

The actual implementation in LSMTreeFullTextIndex.java uses a different, more correct logic by parsing terms into QueryTerm objects. To avoid confusion and ensure the plan accurately reflects the implementation, it would be beneficial to update this section of the plan.

Comment on lines 145 to 171
public void withMetadata(final JSONObject json) {
final FullTextIndexMetadata meta = (FullTextIndexMetadata) metadata;

if (json.has("analyzer"))
meta.setAnalyzerClass(json.getString("analyzer"));

if (json.has("index_analyzer"))
meta.setIndexAnalyzerClass(json.getString("index_analyzer"));

if (json.has("query_analyzer"))
meta.setQueryAnalyzerClass(json.getString("query_analyzer"));

if (json.has("allowLeadingWildcard"))
meta.setAllowLeadingWildcard(json.getBoolean("allowLeadingWildcard"));

if (json.has("defaultOperator"))
meta.setDefaultOperator(json.getString("defaultOperator"));

// Parse per-field analyzers (pattern: *_analyzer)
final String analyzerSuffix = "_analyzer";
for (final String key : json.keySet()) {
if (key.endsWith(analyzerSuffix) && !key.equals("analyzer") && !key.equals("index_analyzer") && !key.equals("query_analyzer")) {
final String fieldName = key.substring(0, key.length() - analyzerSuffix.length());
meta.setFieldAnalyzer(fieldName, json.getString(key));
}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This withMetadata(JSONObject) method duplicates the logic from FullTextIndexMetadata.fromJSON(). To improve maintainability and avoid code duplication, this method could be simplified to directly call fromJSON() on the metadata object.

  public void withMetadata(final JSONObject json) {
    ((FullTextIndexMetadata) metadata).fromJSON(json);
  }

@codacy-production
Copy link

codacy-production bot commented Jan 24, 2026

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
+0.24% 79.57%
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (cc5dadd) 119127 64614 54.24%
Head commit (ac30be5) 119954 (+827) 65347 (+733) 54.48% (+0.24%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#3221) 1116 888 79.57%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

@robfrank
Copy link
Collaborator Author

Addressed the relevant review comments in commit 2227197:

1. Critical - Boolean MUST/SHOULD logic (FullTextQueryExecutor.java) ✅ Fixed

  • Documents matching only SHOULD clauses are no longer returned when MUST clauses are present
  • SHOULD clauses now correctly add bonus score to documents that already satisfy all MUST clauses
  • Added mustWithShouldQuery test case to verify the fix

2. Medium - Code duplication (TypeFullTextIndexBuilder.java) ✅ Fixed

  • Simplified withMetadata(JSONObject) to delegate to FullTextIndexMetadata.fromJSON()

Not addressed:

  • High - TypeIndex sharding comment: This is a limitation in TypeIndex's bucket selection strategy for full-text queries, not a bug in this PR. The test comment documents this workaround. A proper fix would require changes to TypeIndex itself.
  • Medium - Plan documentation: The plan file is historical documentation of the implementation approach, not production code.

@robfrank robfrank force-pushed the feat/improve-fulltext branch 2 times, most recently from c4d23db to 5f07111 Compare January 25, 2026 16:43
robfrank and others added 22 commits January 26, 2026 08:52
Design document covering:
- Configurable Lucene analyzers via METADATA JSON block
- Multi-property full-text indexes
- SEARCH_INDEX() and SEARCH_FIELDS() SQL functions
- Lucene QueryParser syntax support
- $score projection variable for relevance scoring
- Backward compatibility with existing CONTAINSTEXT operator

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Detailed TDD implementation plan with 14 tasks across 5 phases:
- Phase 1: Infrastructure (metadata, builder, SQL parser)
- Phase 2: Multi-property index support
- Phase 3: Query functions (SEARCH_INDEX, SEARCH_FIELDS)
- Phase 4: Score exposure ($score in SQL)
- Phase 5: Testing & documentation

Each task includes failing tests, minimal implementations, and commits.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add FullTextIndexMetadata class that extends IndexMetadata to store
Lucene analyzer configuration for full-text indexes. Supports:
- Default analyzer class (StandardAnalyzer)
- Separate index and query analyzers
- Per-field analyzer overrides via *_analyzer JSON keys
- Query parser options (allowLeadingWildcard, defaultOperator)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a dedicated builder class for full-text indexes that enables
programmatic configuration of Lucene analyzer settings. This follows
the same pattern as TypeLSMVectorIndexBuilder for vector indexes.

The builder supports:
- Setting default, index-specific, and query-specific analyzers
- Per-field analyzer configuration
- Leading wildcard and default operator options
- JSON-based metadata configuration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add support for passing METADATA clause to full-text index builder when
creating indexes via SQL. This enables SQL commands like:

  CREATE INDEX ON Article (title) FULL_TEXT METADATA {"analyzer": "..."}

to pass analyzer configuration to the TypeFullTextIndexBuilder.

The test is @disabled until Task 1.4 (LSMTreeFullTextIndex using
configurable analyzer) is implemented.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update LSMTreeFullTextIndex to use FullTextIndexMetadata configuration:
- Add separate indexAnalyzer and queryAnalyzer fields
- Use metadata.getIndexAnalyzerClass() for put/remove operations
- Use metadata.getQueryAnalyzerClass() for get operations
- Add createAnalyzer() helper to instantiate analyzers by class name
- Add getIndexAnalyzer() and getFullTextMetadata() accessor methods
- Enable createIndexWithMetadata test which validates end-to-end flow

This completes Phase 1 of the full-text index improvements, connecting
the SQL METADATA clause through to actual analyzer instantiation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove single-property restriction in IndexFactoryHandler
- Store tokens with field prefix (fieldname:token) for field-specific queries
- Store unprefixed tokens for general queries across all fields
- Parse query text to identify field-specific terms (field:value)
- Handle TransactionIndexContext commit replay correctly by detecting
  tokenized values via key length mismatch
- Update tests: add multi-property tests, update non-STRING property test

Multi-property indexes enable searching across multiple document fields
with a single index, supporting both field-specific (title:java) and
general (java) queries.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
… index persistence

Multi-property full-text indexes were broken after database restart because
the propertyCount field was hardcoded to 1 in loading constructors. When put()
was called with 2 keys after restart, the check `keys.length != propertyCount`
incorrectly treated the values as "already tokenized" and bypassed proper
tokenization, corrupting the index.

The fix replaces the propertyCount field with a getPropertyCount() method that
derives the value dynamically from getPropertyNames().size(). This ensures
the correct property count is used regardless of how the index was loaded.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a SQL function SEARCH_INDEX('indexName', 'query') that searches
a full-text index by name and returns true if the current record
matches the query. This enables filtering records in WHERE clauses
using full-text search capabilities.

Usage: SELECT FROM Article WHERE SEARCH_INDEX('Article[content]', 'java') = true

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Cache search results in CommandContext to avoid re-querying the full-text
index for every record during WHERE clause evaluation. Previously, the
index was queried N times for N records; now it queries once and caches.

Also adds null parameter validation and additional tests for error handling.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add FullTextQueryExecutor that uses Lucene's QueryParser to parse advanced
query syntax (boolean operators, phrases, wildcards) and execute against
LSMTreeFullTextIndex. This enables advanced search features like:
- Boolean operators: AND (+), OR, NOT (-)
- Phrase queries: "java programming"
- Wildcards (suffix): java*
- Field-specific search: field:value

The executor translates parsed Lucene Query objects into LSM-Tree lookups
and aggregates results with proper scoring. Results are sorted by score
descending and support result limiting.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create QueryParser per search() invocation instead of storing as instance field
- Add deterministic secondary sort by RID when scores are equal
- Add graceful fallback for unsupported query types (FuzzyQuery, etc.)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SQLFunctionSearchIndex now uses FullTextQueryExecutor for Lucene query parsing
- Enables boolean queries (+term, -term), phrase queries, wildcards
- Maintains caching for performance (now caches Map<RID, score> instead of Set<RID>)
- Added tests for boolean AND, boolean NOT, and phrase queries

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Creates SQLFunctionSearchFields for field-based full-text search
- Automatically finds appropriate full-text index for given fields
- Supports same Lucene query syntax as SEARCH_INDEX
- Includes caching for performance
- Registers function in DefaultSQLFunctionFactory

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add score field to ResultInternal for full-text search relevance
- getScore()/setScore() methods for direct access
- $score accessible via getProperty("$score")
- hasProperty("$score") always returns true
- $score appears in getPropertyNames() when score > 0

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix ResultInternal.getProperty("$score") to check content map first
  before falling back to the score field. This ensures projections
  that set "$score" as a property are returned correctly.
- Update SQLFunctionSearchIndex to set $score context variable when
  a record matches, enabling $score projection in SELECT queries.
- Add scoreInSQLProjection test to verify $score works in SQL queries
  with SEARCH_INDEX function.
- Clean up debug logging from search functions.

The fix addresses an issue where getProperty("$score") immediately
returned the default score field (0.0) instead of checking if "$score"
was explicitly set as a property in the content map by the projection.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1. Fix boolean MUST/SHOULD logic in FullTextQueryExecutor (critical)
   - Documents matching only SHOULD clauses are no longer returned
     when MUST clauses are present
   - SHOULD clauses now correctly add bonus score to documents that
     already satisfy all MUST clauses
   - Added mustWithShouldQuery test case

2. Remove code duplication in TypeFullTextIndexBuilder (medium)
   - Simplified withMetadata(JSONObject) to delegate to fromJSON()

3. Fix FullTextIndexMetadata.fromJSON() to only call parent when
   typeName is present in JSON

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Field-specific queries like "title:java" now correctly search using
the field-prefixed key format used by multi-property indexes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add 7 integration test classes covering all full-text index features:
- FullTextAnalyzerConfigIT: analyzer configuration and stemming
- FullTextQuerySyntaxIT: Lucene query syntax (boolean, phrase, wildcards)
- FullTextMultiPropertyIT: multi-property index search
- FullTextScoreIT: $score projection and ordering
- FullTextEdgeCasesIT: error handling and edge cases
- FullTextPersistenceIT: index persistence across reopens
- FullTextBackwardCompatIT: CONTAINSTEXT backward compatibility

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
robfrank and others added 12 commits January 26, 2026 08:52
Implements the More Like This search algorithm:
1. Extract terms from source documents
2. Calculate document frequencies
3. Select top terms using MoreLikeThisQueryBuilder
4. Execute OR query and score results
5. Optionally exclude source documents

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changes method parameter from List<RID> to Set<RID> to match
specification and prevent duplicate source RIDs. Updates all
tests to use Set.of() instead of List.of().

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements More Like This search by index name with:
- RID-based similarity search
- Optional metadata configuration
- Score normalization ($similarity)
- Fail-fast validation
- Comprehensive test coverage (7 tests)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixes:
- Cache key collision bug (was using identityHashCode)
- Added hashCode/equals to MoreLikeThisConfig
- Explicit type conversion for scores
- Enhanced test data for reliable MLT results

Enhancements:
- Added cache behavior test
- Added multiple source RIDs test
- Added score ordering test
- Added score/similarity consistency test

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements More Like This search by field names with:
- Field-based index resolution
- RID-based similarity search
- Optional metadata configuration
- Score normalization ($similarity)
- Fail-fast validation
- Comprehensive test coverage (9 tests)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added tests for:
- scoreAndSimilarityConsistent: Verify $score and $similarity both set correctly
- exceedsMaxSourceDocs: Verify maxSourceDocs limit enforcement

Brings test coverage to 100% (11/11 tests)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
End-to-end tests covering:
- Basic similarity search with real documents
- Multi-source RID term combination
- Score ordering and normalization
- Both $score and $similarity exposure
- excludeSource behavior (true/false)
- Parameter tuning effects (minTermFreq, maxQueryTerms)
- Error handling (invalid RIDs)
- Empty result handling (no matches)
- SEARCH_INDEX_MORE vs SEARCH_FIELDS_MORE equivalence
- Field-specific term extraction
- maxQueryTerms limit enforcement

All 12 integration tests passing.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixes:
- Explicit assertions for expected documents in basicSimilaritySearch
- Use stored RIDs instead of hardcoded values for test independence
- Remove test interdependence (fieldSpecificTermExtraction now standalone)
- Add descriptive assertion messages for better failure diagnostics

All 12 tests passing with improved reliability.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated design and implementation plan status to reflect
completion of all 8 tasks with 55 passing tests.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Complete documentation covering:
- Overview and use cases
- SQL function signatures (SEARCH_INDEX_MORE, SEARCH_FIELDS_MORE)
- Scoring ( and )
- Configuration parameters (9 parameters with examples)
- How the TF-IDF algorithm works
- Multiple source document handling
- Tuning strategies (broad vs precise results)
- Error handling and validation
- Performance considerations
- Complete examples (recommendations, duplicates, multi-source)
- Integration with other features
- Best practices and limitations

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Complete reference covering all 4 SQL functions:
- SEARCH_INDEX() - Keyword search by index name
- SEARCH_FIELDS() - Keyword search by field names
- SEARCH_INDEX_MORE() - Similarity search by index name
- SEARCH_FIELDS_MORE() - Similarity search by field names

Includes:
- Function signatures and parameters
- Query syntax (boolean, phrase, wildcards, field-specific)
- Scoring ( for keyword,  for MLT)
- Configuration parameters (9 MLT parameters)
- 30+ complete examples
- Performance optimization guidance
- Best practices for both search types
- Error handling reference
- Comparison table (keyword vs similarity)
- Limitations and considerations

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@robfrank robfrank force-pushed the feat/improve-fulltext branch from cd329dc to 72a3fe3 Compare January 26, 2026 07:53
@robfrank
Copy link
Collaborator Author

Response to Review Comments

All review comments have been addressed:

1. ✅ Critical - Boolean MUST/SHOULD logic (FullTextQueryExecutor.java:201)

Status: Fixed by @robfrank in commit 2227197

  • Documents matching only SHOULD clauses are no longer returned when MUST clauses are present
  • Added test case mustWithShouldQuery to verify the fix

2. ✅ High Priority - TypeIndex sharding (LSMTreeFullTextIndexTest.java:272)

Status: Fixed in latest commits

  • Modified TypeIndex.getIndexesByKeys() to explicitly detect full-text indexes and bypass bucket selection
  • Full-text searches now scan ALL buckets regardless of sharding strategy
  • Removed workaround from multiPropertyIndexFieldSpecificSearch test - now uses TypeIndex directly
  • Added new test fullTextIndexWithShardedType to verify correct behavior with sharded types
  • All related tests pass (LSMTreeFullTextIndexTest, ACIDTransactionTest, LSMTreeIndexTest)

Technical details: The fix ensures that full-text queries containing search terms (e.g., "java", "title:java") are not subject to bucket selection based on hashing those strings. Instead, they always search all buckets to ensure complete results, which is critical for correctness on sharded types.

3. ✅ Medium Priority - Code duplication (TypeFullTextIndexBuilder.java:147)

Status: Fixed by @robfrank in commit 2227197

  • Simplified withMetadata(JSONObject) to delegate to FullTextIndexMetadata.fromJSON()

4. ⏭️ Medium Priority - Plan documentation (docs/plans/2026-01-23-fulltext-index-implementation.md:704)

Status: Not addressed

  • As noted by @robfrank, this is historical documentation of the implementation approach, not production code
  • The actual implementation in LSMTreeFullTextIndex.java is correct
  • Low priority since it doesn't affect functionality

All critical and high-priority issues have been resolved. The full-text index implementation now correctly handles sharded types and boolean query logic.

@robfrank
Copy link
Collaborator Author

Updated the previous comment - point #4 has now been addressed:

4. ✅ Medium Priority - Plan documentation (docs/plans/2026-01-23-fulltext-index-implementation.md:704)

Status: Fixed

  • Removed copy-paste error in the plan document
  • Added explanatory note that the actual implementation in FullTextQueryExecutor.java uses QueryTerm objects and constructs search keys appropriately (field + ":" + text for field-specific queries, text alone for unqualified queries)
  • The simplified representation in the plan now references the actual implementation

All review comments have been addressed.

@robfrank robfrank requested a review from lvca January 26, 2026 12:37
@robfrank robfrank added this to the 26.2.1 milestone Jan 26, 2026
@lvca lvca added the enhancement New feature or request label Jan 26, 2026
@robfrank robfrank merged commit 6a4ed39 into main Jan 26, 2026
19 of 24 checks passed
@robfrank robfrank deleted the feat/improve-fulltext branch January 26, 2026 16:48
robfrank added a commit that referenced this pull request Feb 17, 2026
#3220 improvement to Lucene fulltext LSM index: added functions, configurability, tests

(cherry picked from commit 6a4ed39)
mergify bot added a commit that referenced this pull request Feb 22, 2026
…from 3.5.4 to 3.5.5 [skip ci]

Bumps [org.apache.maven.plugins:maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 3.5.4 to 3.5.5.
Release notes

*Sourced from [org.apache.maven.plugins:maven-failsafe-plugin's releases](https://github.com/apache/maven-surefire/releases).*

> 3.5.5
> -----
>
> 🚀 New features and improvements
> -------------------------------
>
> * Replace runing external process and parsing output with simple ProcessHandle if available (Java9+) ([#3252](https://redirect.github.com/apache/maven-surefire/pull/3252)) [`@​olamy`](https://github.com/olamy)
> * Pass slf4j context to spawned thread ([#3241](https://redirect.github.com/apache/maven-surefire/pull/3241)) [`@​scottrw93`](https://github.com/scottrw93)
> * [[SUREFIRE-3239]](https://issues.apache.org/jira/browse/SUREFIRE-3239) - allow override of statistics file checksum ([#3247](https://redirect.github.com/apache/maven-surefire/pull/3247)) [`@​XN137`](https://github.com/XN137)
> * Reduce log level for skipped tests result to info ([#3232](https://redirect.github.com/apache/maven-surefire/pull/3232)) [`@​strangelookingnerd`](https://github.com/strangelookingnerd)
>
> 🐛 Bug Fixes
> -----------
>
> * Use PowerShell instead of WMIC for detecting zombie process on Windows ([#3258](https://redirect.github.com/apache/maven-surefire/pull/3258)) [`@​jbliznak`](https://github.com/jbliznak). Please note if you are using Windows with Java 8 and not PowerShell (you have options to: use Java 9+, install PowerShell or stay on Surefire 3.5.4)
> * Properly work with test failures caused during beforeAll phase ([#3194](https://redirect.github.com/apache/maven-surefire/pull/3194)) [`@​Frawless`](https://github.com/Frawless)
>
> 📝 Documentation updates
> -----------------------
>
> * Clarify how late placeholder replacement (@{...}) deals with ([#3208](https://redirect.github.com/apache/maven-surefire/pull/3208)) [`@​kwin`](https://github.com/kwin)
>
> 👻 Maintenance
> -------------
>
> * Fix Jenkin badges in README ([#3254](https://redirect.github.com/apache/maven-surefire/pull/3254)) [`@​slawekjaranowski`](https://github.com/slawekjaranowski)
> * Use JUnit5 in failsafe ITs ([#3251](https://redirect.github.com/apache/maven-surefire/pull/3251)) [`@​slawekjaranowski`](https://github.com/slawekjaranowski)
> * Remove long-deprecated unused encoding property from VerifyMojo ([#3198](https://redirect.github.com/apache/maven-surefire/pull/3198)) [`@​Tomlincoln`](https://github.com/Tomlincoln)
> * Add IT and deal with corner cases of handling beforeAll failures ([#3200](https://redirect.github.com/apache/maven-surefire/pull/3200)) [`@​Frawless`](https://github.com/Frawless)
> * Revert PR [#3194](https://redirect.github.com/apache/maven-surefire/issues/3194) that handle beforeAll failures to follow proper contributing rules ([#3211](https://redirect.github.com/apache/maven-surefire/pull/3211)) [`@​Frawless`](https://github.com/Frawless)
>
> 🔧 Build
> -------
>
> * Missing many files in the GH Artifacts of CI ex-post. ([#3219](https://redirect.github.com/apache/maven-surefire/pull/3219)) [`@​Tibor17`](https://github.com/Tibor17)
>
> 📦 Dependency updates
> --------------------
>
> * Bump org.xmlunit:xmlunit-core from 2.10.4 to 2.11.0 ([#3209](https://redirect.github.com/apache/maven-surefire/pull/3209)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.maven.plugin-testing:maven-plugin-testing-harness from 3.4.0 to 3.5.1 ([#3260](https://redirect.github.com/apache/maven-surefire/pull/3260)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump parent from 44 to 47 ([#3253](https://redirect.github.com/apache/maven-surefire/pull/3253)) [`@​slawekjaranowski`](https://github.com/slawekjaranowski)
> * Bump org.assertj:assertj-core from 3.16.1 to 3.27.7 in /surefire-its/src/test/resources/surefire-1733-testng ([#3246](https://redirect.github.com/apache/maven-surefire/pull/3246)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.assertj:assertj-core from 3.27.6 to 3.27.7 ([#3245](https://redirect.github.com/apache/maven-surefire/pull/3245)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.mojo:animal-sniffer-maven-plugin from 1.26 to 1.27 ([#3243](https://redirect.github.com/apache/maven-surefire/pull/3243)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.20.0 to 4.21.0 ([#3236](https://redirect.github.com/apache/maven-surefire/pull/3236)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-java from 1.5.1 to 1.5.2 ([#3235](https://redirect.github.com/apache/maven-surefire/pull/3235)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.logging.log4j:log4j-core from 2.17.1 to 2.25.3 in /surefire-its/src/test/resources/surefire-1659-stream-corruption ([#3234](https://redirect.github.com/apache/maven-surefire/pull/3234)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.19.0 to 4.20.0 ([#3228](https://redirect.github.com/apache/maven-surefire/pull/3228)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.18.0 to 4.19.0 ([#3224](https://redirect.github.com/apache/maven-surefire/pull/3224)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.commons:commons-lang3 from 3.19.0 to 3.20.0 ([#3223](https://redirect.github.com/apache/maven-surefire/pull/3223)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-interpolation from 1.28 to 1.29 ([#3221](https://redirect.github.com/apache/maven-surefire/pull/3221)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-i18n from 1.0.0 to 1.1.0 ([#3220](https://redirect.github.com/apache/maven-surefire/pull/3220)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump commons-io:commons-io from 2.20.0 to 2.21.0 ([#3217](https://redirect.github.com/apache/maven-surefire/pull/3217)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.maven.plugin-testing:maven-plugin-testing-harness from 3.3.0 to 3.4.0 ([#3214](https://redirect.github.com/apache/maven-surefire/pull/3214)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-java from 1.5.0 to 1.5.1 ([#3218](https://redirect.github.com/apache/maven-surefire/pull/3218)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.16.0 to 4.18.0 ([#3213](https://redirect.github.com/apache/maven-surefire/pull/3213)) @[dependabot[bot]](https://github.com/apps/dependabot)

... (truncated)


Commits

* [`968cb38`](apache/maven-surefire@968cb38) [maven-release-plugin] prepare release surefire-3.5.5
* [`8e7dc41`](apache/maven-surefire@8e7dc41) Reapply "Replace runing external process and parsing output with simple Proce...
* [`4ced57c`](apache/maven-surefire@4ced57c) Revert "Replace runing external process and parsing output with simple Proces…"
* [`8496d9a`](apache/maven-surefire@8496d9a) Bump org.xmlunit:xmlunit-core from 2.10.4 to 2.11.0 ([#3209](https://redirect.github.com/apache/maven-surefire/issues/3209))
* [`68265e5`](apache/maven-surefire@68265e5) Bump org.apache.maven.plugin-testing:maven-plugin-testing-harness ([#3260](https://redirect.github.com/apache/maven-surefire/issues/3260))
* [`0b19014`](apache/maven-surefire@0b19014) Replace runing external process and parsing output with simple ProcessHandle ...
* [`688f8c4`](apache/maven-surefire@688f8c4) Use PowerShell instead of WMIC for detecting zombie process on Windows ([#3258](https://redirect.github.com/apache/maven-surefire/issues/3258))
* [`e5c01a6`](apache/maven-surefire@e5c01a6) Build only by the latest Maven on Jenkins ([#3255](https://redirect.github.com/apache/maven-surefire/issues/3255))
* [`9c99e97`](apache/maven-surefire@9c99e97) Fix Jenkin badges in README ([#3254](https://redirect.github.com/apache/maven-surefire/issues/3254))
* [`20930ea`](apache/maven-surefire@20930ea) Bump parent from 44 to 47 ([#3253](https://redirect.github.com/apache/maven-surefire/issues/3253))
* Additional commits viewable in [compare view](apache/maven-surefire@surefire-3.5.4...surefire-3.5.5)
  
[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility\_score?dependency-name=org.apache.maven.plugins:maven-failsafe-plugin&package-manager=maven&previous-version=3.5.4&new-version=3.5.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
  
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot show  ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
mergify bot added a commit that referenced this pull request Feb 22, 2026
…from 3.5.4 to 3.5.5 [skip ci]

Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.4 to 3.5.5.
Release notes

*Sourced from [org.apache.maven.plugins:maven-surefire-plugin's releases](https://github.com/apache/maven-surefire/releases).*

> 3.5.5
> -----
>
> 🚀 New features and improvements
> -------------------------------
>
> * Replace runing external process and parsing output with simple ProcessHandle if available (Java9+) ([#3252](https://redirect.github.com/apache/maven-surefire/pull/3252)) [`@​olamy`](https://github.com/olamy)
> * Pass slf4j context to spawned thread ([#3241](https://redirect.github.com/apache/maven-surefire/pull/3241)) [`@​scottrw93`](https://github.com/scottrw93)
> * [[SUREFIRE-3239]](https://issues.apache.org/jira/browse/SUREFIRE-3239) - allow override of statistics file checksum ([#3247](https://redirect.github.com/apache/maven-surefire/pull/3247)) [`@​XN137`](https://github.com/XN137)
> * Reduce log level for skipped tests result to info ([#3232](https://redirect.github.com/apache/maven-surefire/pull/3232)) [`@​strangelookingnerd`](https://github.com/strangelookingnerd)
>
> 🐛 Bug Fixes
> -----------
>
> * Use PowerShell instead of WMIC for detecting zombie process on Windows ([#3258](https://redirect.github.com/apache/maven-surefire/pull/3258)) [`@​jbliznak`](https://github.com/jbliznak). Please note if you are using Windows with Java 8 and not PowerShell (you have options to: use Java 9+, install PowerShell or stay on Surefire 3.5.4)
> * Properly work with test failures caused during beforeAll phase ([#3194](https://redirect.github.com/apache/maven-surefire/pull/3194)) [`@​Frawless`](https://github.com/Frawless)
>
> 📝 Documentation updates
> -----------------------
>
> * Clarify how late placeholder replacement (@{...}) deals with ([#3208](https://redirect.github.com/apache/maven-surefire/pull/3208)) [`@​kwin`](https://github.com/kwin)
>
> 👻 Maintenance
> -------------
>
> * Fix Jenkin badges in README ([#3254](https://redirect.github.com/apache/maven-surefire/pull/3254)) [`@​slawekjaranowski`](https://github.com/slawekjaranowski)
> * Use JUnit5 in failsafe ITs ([#3251](https://redirect.github.com/apache/maven-surefire/pull/3251)) [`@​slawekjaranowski`](https://github.com/slawekjaranowski)
> * Remove long-deprecated unused encoding property from VerifyMojo ([#3198](https://redirect.github.com/apache/maven-surefire/pull/3198)) [`@​Tomlincoln`](https://github.com/Tomlincoln)
> * Add IT and deal with corner cases of handling beforeAll failures ([#3200](https://redirect.github.com/apache/maven-surefire/pull/3200)) [`@​Frawless`](https://github.com/Frawless)
> * Revert PR [#3194](https://redirect.github.com/apache/maven-surefire/issues/3194) that handle beforeAll failures to follow proper contributing rules ([#3211](https://redirect.github.com/apache/maven-surefire/pull/3211)) [`@​Frawless`](https://github.com/Frawless)
>
> 🔧 Build
> -------
>
> * Missing many files in the GH Artifacts of CI ex-post. ([#3219](https://redirect.github.com/apache/maven-surefire/pull/3219)) [`@​Tibor17`](https://github.com/Tibor17)
>
> 📦 Dependency updates
> --------------------
>
> * Bump org.xmlunit:xmlunit-core from 2.10.4 to 2.11.0 ([#3209](https://redirect.github.com/apache/maven-surefire/pull/3209)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.maven.plugin-testing:maven-plugin-testing-harness from 3.4.0 to 3.5.1 ([#3260](https://redirect.github.com/apache/maven-surefire/pull/3260)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump parent from 44 to 47 ([#3253](https://redirect.github.com/apache/maven-surefire/pull/3253)) [`@​slawekjaranowski`](https://github.com/slawekjaranowski)
> * Bump org.assertj:assertj-core from 3.16.1 to 3.27.7 in /surefire-its/src/test/resources/surefire-1733-testng ([#3246](https://redirect.github.com/apache/maven-surefire/pull/3246)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.assertj:assertj-core from 3.27.6 to 3.27.7 ([#3245](https://redirect.github.com/apache/maven-surefire/pull/3245)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.mojo:animal-sniffer-maven-plugin from 1.26 to 1.27 ([#3243](https://redirect.github.com/apache/maven-surefire/pull/3243)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.20.0 to 4.21.0 ([#3236](https://redirect.github.com/apache/maven-surefire/pull/3236)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-java from 1.5.1 to 1.5.2 ([#3235](https://redirect.github.com/apache/maven-surefire/pull/3235)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.logging.log4j:log4j-core from 2.17.1 to 2.25.3 in /surefire-its/src/test/resources/surefire-1659-stream-corruption ([#3234](https://redirect.github.com/apache/maven-surefire/pull/3234)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.19.0 to 4.20.0 ([#3228](https://redirect.github.com/apache/maven-surefire/pull/3228)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.18.0 to 4.19.0 ([#3224](https://redirect.github.com/apache/maven-surefire/pull/3224)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.commons:commons-lang3 from 3.19.0 to 3.20.0 ([#3223](https://redirect.github.com/apache/maven-surefire/pull/3223)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-interpolation from 1.28 to 1.29 ([#3221](https://redirect.github.com/apache/maven-surefire/pull/3221)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-i18n from 1.0.0 to 1.1.0 ([#3220](https://redirect.github.com/apache/maven-surefire/pull/3220)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump commons-io:commons-io from 2.20.0 to 2.21.0 ([#3217](https://redirect.github.com/apache/maven-surefire/pull/3217)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.apache.maven.plugin-testing:maven-plugin-testing-harness from 3.3.0 to 3.4.0 ([#3214](https://redirect.github.com/apache/maven-surefire/pull/3214)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.codehaus.plexus:plexus-java from 1.5.0 to 1.5.1 ([#3218](https://redirect.github.com/apache/maven-surefire/pull/3218)) @[dependabot[bot]](https://github.com/apps/dependabot)
> * Bump org.htmlunit:htmlunit from 4.16.0 to 4.18.0 ([#3213](https://redirect.github.com/apache/maven-surefire/pull/3213)) @[dependabot[bot]](https://github.com/apps/dependabot)

... (truncated)


Commits

* [`968cb38`](apache/maven-surefire@968cb38) [maven-release-plugin] prepare release surefire-3.5.5
* [`8e7dc41`](apache/maven-surefire@8e7dc41) Reapply "Replace runing external process and parsing output with simple Proce...
* [`4ced57c`](apache/maven-surefire@4ced57c) Revert "Replace runing external process and parsing output with simple Proces…"
* [`8496d9a`](apache/maven-surefire@8496d9a) Bump org.xmlunit:xmlunit-core from 2.10.4 to 2.11.0 ([#3209](https://redirect.github.com/apache/maven-surefire/issues/3209))
* [`68265e5`](apache/maven-surefire@68265e5) Bump org.apache.maven.plugin-testing:maven-plugin-testing-harness ([#3260](https://redirect.github.com/apache/maven-surefire/issues/3260))
* [`0b19014`](apache/maven-surefire@0b19014) Replace runing external process and parsing output with simple ProcessHandle ...
* [`688f8c4`](apache/maven-surefire@688f8c4) Use PowerShell instead of WMIC for detecting zombie process on Windows ([#3258](https://redirect.github.com/apache/maven-surefire/issues/3258))
* [`e5c01a6`](apache/maven-surefire@e5c01a6) Build only by the latest Maven on Jenkins ([#3255](https://redirect.github.com/apache/maven-surefire/issues/3255))
* [`9c99e97`](apache/maven-surefire@9c99e97) Fix Jenkin badges in README ([#3254](https://redirect.github.com/apache/maven-surefire/issues/3254))
* [`20930ea`](apache/maven-surefire@20930ea) Bump parent from 44 to 47 ([#3253](https://redirect.github.com/apache/maven-surefire/issues/3253))
* Additional commits viewable in [compare view](apache/maven-surefire@surefire-3.5.4...surefire-3.5.5)
  
[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility\_score?dependency-name=org.apache.maven.plugins:maven-surefire-plugin&package-manager=maven&previous-version=3.5.4&new-version=3.5.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
  
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot show  ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Full-Text Index Engine Improvements

2 participants