Commit Graph

37726 Commits

Author SHA1 Message Date
Adrien Grand 4aeecdfebf
Speed up top-k retrieval of filtered disjunctions a bit. (#13996)
This moves work from `advance(int target)` to `TwoPhaseIterator#matches()` so
that we do less work on hits that do not match the filter.
2024-11-19 09:53:45 +01:00
Adrien Grand 5807ff1620
Only consider clauses whose cost is less than the lead cost to compute block boundaries in WANDScorer. (#14000)
WANDScorer implements block-max WAND and needs to recompute score upper bounds
whenever it moves to a different block. Thus it's important for these blocks to
be large enough to avoid re-computing score upper bounds over and over again.
With this commit, WANDScorer no longer uses clauses whose cost is higher than
the cost of the filter to compute block boundaries. This effectively makes
blocks larger when the filter is more selective.
2024-11-19 09:27:13 +01:00
Viswanath Kuchibhotla a991a9a861
Adding filter to the toString() method of KnnFloatVectorQuery (#13990)
* Adding filter to toString() of KnnFloatVectorQuery when it's present (addresses https://github.com/apache/lucene/issues/13983)

* addressing review comments

* adding knnbytevectorquery

* unit test improvements

* tidy

* adding changes entry for the bug fix
2024-11-18 14:44:26 -05:00
Adrien Grand 4400d55297
Speed up top-k retrieval on filtered conjunctions. (#13994)
A while back we added an optimized bulk scorer that implements block-max AND,
this yielded a good speedup on nightly benchmarks, see annotation `FP` at
https://benchmarks.mikemccandless.com/AndHighHigh.html. With this PR, filtered
conjunctions now also run through this optimized bulk scorer by doing two
things:
 - It flattens inner conjunctions. This makes queries initially written as
   something like `+(+term1 +term2) #filter` rewritten to
   `+term1 +term2 #filter`.
 - It evaluates queries that have a mix of MUST and FILTER clauses evaluated
   through `BlockMaxConjunctionBulkScorer` by treating FILTER clauses as
   scoring clauses that produce a score of 0.
2024-11-18 08:51:35 +01:00
Viswanath Kuchibhotla a0e1eeefeb
Suppressing "automatic module" warning for benchmark-jmh (#13997)
via Viswanath Kuchibhotla
2024-11-17 07:41:27 -05:00
Lu Xugang 300862bd20
Remove duplicate test code (#13982)
The only diff between doIterate1  and doIterate2  is bb < b.length() in doIterate1 , but this condition is always true, so we should remove it
2024-11-16 02:09:41 +08:00
Chris Hegarty 8698dd85d8
Allow easier verification of the Panama Vectorization provider with newer Java versions (#13986)
This commit allows easier verification of the Panama Vectorization provider with newer Java versions.

The upper bound Java version of the Vectorization provider is hardcoded to the version that has been tested and is known to work. This is a bit inflexible when experimenting with and verifying newer JDK versions. This change proposes to add a new system property that allows to set the upper bound of the range of Java versions supported.

With this change, and the accompanying small gradle change, then one can verify newer JDKs as follows:

CI=true; RUNTIME_JAVA_HOME=/Users/chegar/binaries/jdk-24.jdk-ea-b23/Contents/Home
./gradlew :lucene:core:test -Dorg.apache.lucene.vectorization.upperJavaFeatureVersion=24

This change helps both testing and verifying with Early Access JDK builds, as well as allowing to override the upper bound when the JDK is known to work fine.
2024-11-14 09:02:15 +00:00
Adrien Grand 6fe8165cac
Simplify codec setup in vector-related tests. (#13970)
Many of vector-related tests set up a codec manually by extending the current
codec. This makes bumping the current codec a bit painful as all these files
need to be touched. This commit migrates to `TestUtil#alwaysKnnVectorsFormat`,
similarly to what we do for postings and doc values.
2024-11-12 10:38:54 +01:00
Ignacio Vera 65457224fb
Tessellator: Improve logic when two holes share the same vertex with the polygon (#13980)
This commit tries to improve the algorithm by:

1.- If there is only one vertex, then there is not further checks and that's the one used.

2.- if there is a common vertex, it first compute the signed area of the join, if they have different sign, 
it chooses the negative one as that's the convex union. If they have the same sign, it computes the angle 
of the join and chooses the smallest angle.
2024-11-11 13:28:09 +01:00
Adrien Grand 12ca4779b9
Fix TestPostingsUtil#testIntegerOverflow failure. (#13979)
The group vint logic is mistakenly using the long->int conversion logic for the
case when integers are being written rather than longs.

Closes #13978
2024-11-06 11:34:27 +01:00
Armin Braun a888af76b2
Simplify leaf slice calculation (#13893)
No need to go through the indirection of 2 wrapped functions, just put the logic in plain
methods. Also, we can just outright set the field if there's no executor.
2024-11-06 10:36:06 +01:00
Adrien Grand 539cf3c9a3 Adjust expectations of TestTopFieldCollectorEarlyTermination after #13943. 2024-11-05 23:52:56 +01:00
Adrien Grand bc18828fcc
Remove `supportsConcurrency` flag from top-docs collector managers. (#13977)
Our collector managers have a `supportsConcurrency` flag to optimize the case
when they are used in a single thread. This PR proposes to remove this flag now
that the optimization doesn't do much as a result of #13943.
2024-11-05 15:36:40 +01:00
Ignacio Vera 07955ff88d Avoid performance regression by constructing lazily the PointTree in NumericComparator (#13498) (#13877) 2024-11-05 12:07:41 +01:00
Luca Cavanna e37eaea11a
Revert "Disjunction as CompetitiveIterator for numeric dynamic pruning (#13221)" (#13857) (#13971)
This reverts commit 1ee4f8a111.

We have observed performance regressions that can be linked to #13221. We will need to revise the logic that such change introduced in main and branch_10x. While we do so, I propose that we bake it out of branch_10_0 and we release Lucene 10 without it.

Closes #13856
2024-11-05 12:00:45 +01:00
Greg Miller a3d56ea2ee
A few small tweaks to VectorUtil#findNextGEQ: (#13972)
1. Rearrange/rename the parameters to be more idiomatic (e.g., follow conventions of Arrays#... methods)
2. Add assert to ensure expected sortedness we may rely on in the future (so we're not trappy)
3. Migrate PostingsReader to call VectorUtil instead of VectorUtilSupport (so it benefits from the common assert)
2024-11-04 16:09:27 -08:00
Dzung Bui 13285279c2
Rename NodeHash to FSTSuffixNodeCache (#13259) 2024-11-01 18:14:17 -04:00
Adrien Grand cfdd20f5bc
Move postings back to int[] to take advantage of having more lanes per vector. (#13968)
In Lucene 8.4, we updated postings to work on long[] arrays internally. This
allowed us to workaround the lack of explicit vectorization (auto-vectorization
doesn't detect all the scenarios that we would like to handle) support in the
JVM by summing up two integers in one operation for instance.

With explicit vectorization now available, it looks like we can get more
benefits from the ability to compare multiple intetgers in one operations than
from summing up two integers in one operation. Moving back to ints helps
compare 2x more integers at once vs. longs.
2024-11-01 07:49:09 +01:00
panguixin 494b16063e
Replace Map<String,Object> with IntObjectHashMap for KnnVectorsReader (#13763) 2024-10-31 16:16:09 +01:00
Mayya Sharipova 26e0737e40
Account for 0 graph size when initializing HNSW graph (#13964)
When initializing a joint graph from one of the segments' graphs,
 we always assume that a segment's graph is present. But later we want
 to explore an option where some segments will not have graphs (#13447).

This change allows to account for missing graphs.
2024-10-31 10:22:30 -04:00
Adrien Grand 3041af7a94
Speed up advancing within a block, take 2. (#13958)
PR #13692 tried to speed up advancing by using branchless binary search, but while this yielded a speedup on my machine, this yielded a slowdown on nightly benchmarks.

This PR tries a different approach using vectorization. Experimentation suggests that it speeds up queries that advance to the next few doc IDs, such as `AndHighHigh`.
2024-10-30 12:51:36 +01:00
Adrien Grand 9359cfd32f
Speed up Lucene912PostingsReader nextDoc() impls. (#13963)
127 times out of 128, nextDoc() returns the next doc ID in the buffer.
Currently, we check if the current doc is equal to the last doc ID in the block
to know if we need to refill. We can do better by comparing the current index
in the block with the block size, which is a bit more efficient since the
latter is a constant.
2024-10-29 18:16:52 +01:00
panguixin 60ddd08c95
replace Map<String,Object> with IntObjectHashMap for DV producer (#13961) 2024-10-29 16:30:15 +01:00
Adrien Grand 937432acd8
Remove HitsThresholdChecker. (#13943)
`TopScoreDocCollectorManager` has a dependency on `HitsThresholdChecker`, which
is essentially a shared counter that is incremented until it reaches the total
hits threshold, when the scorer can start dynamically pruning hits.

A consequence of this removal is that dynamic pruning may start later, as soon
as:
 - either the current slice collected `totalHitsThreshold` hits,
 - or another slice collected `totalHitsThreshold` hits and the current slice
   collected enough hits (up to 1,024) to check the shared
   `MaxScoreAccumulator`.

So in short, it exchanges a bit more work globally in favor of a bit less
contention. A longer-term goal of mine is to stop specializing our
`CollectorManager`s based on whether they are going to be used concurrently or
not.
2024-10-28 15:50:53 +01:00
Adrien Grand 81ab3b9722 Move CHANGES entry to correct version. 2024-10-26 13:52:55 +02:00
Adrien Grand a3a00f3f58
Remove LeafSimScorer abstraction. (#13957)
`LeafSimScorer` is a specialization of a `SimScorer` for a given segment. It
doesn't add much value, but benchmarks suggest that it adds measurable overhead
to queries sorted by score.
2024-10-26 13:45:54 +02:00
ljak b12ee52999
Ensure stability of clause order for DisjunctionMaxQuery toString (#13944)
Co-authored-by: Laurent <jakubinal@lexum.com>
2024-10-25 18:21:58 +02:00
Adrien Grand 5c080156f5
Disable exchanging minimum scores across slices for exhaustive evaluation. (#13954)
When `totalHitsThreshold` is `Integer.MAX_VALUE`, dynamic pruning is never used
and all hits get evaluated. Thus, the minimum competitive score always stays at
zero, and there is nothing to exchange across slices.
2024-10-25 14:02:04 +02:00
Benjamin Trent 618bfa59a6
Ensure doc order for TestCommonTermsQuery#testMinShouldMatch (#13953) 2024-10-25 07:42:26 -04:00
Shubham Chaudhary bf69c3cf43
Make some BooleanQuery methods public and a new `#add(Collection)` method for BQ builder (#13950) 2024-10-25 13:31:34 +02:00
Adrien Grand 2268242412
Remove some useless code in TopScoreDocCollector. (#13955) 2024-10-25 13:30:49 +02:00
Adrien Grand 8362f609b2
Add MIGRATE entry about the fact that readVLong() may now read up to 10 bytes. (#13956)
This may be of interest for custom `DataInput`/`IndexInput` implementations
that extend `readVLong()`.
2024-10-25 13:30:29 +02:00
Lu Xugang 0bbef32cf5
Check ahead if we can get the count (#13899)
Currently, we traverse the BKD tree or perform a binary search using DocValues first, and then check whether the count can be obtained in the count() method of IndexSortSortedNumericDocValuesRangeQuery.

we should consider providing a mechanism to perform this check beforehand, avoid unnecessary processing when dealing with a sparseRange
2024-10-25 15:05:51 +08:00
Jakub Slowinski 2ec5cc8c17
Removing the deprecated parameters, -fast, -slow, -crossCheckTermVectors from CheckIndex. (#11023) (#13942)
Their usage is replaced with -level with respective values of 1, 3, 3.
2024-10-24 10:46:09 +01:00
Adrien Grand bb3f182251
Introduce a heuristic to amortize the per-window overhead in MaxScoreBulkScorer. (#13941)
It is sometimes possible for `MaxScoreBulkScorer` to compute windows that don't
contain many candidate matches, resulting in more time spent evaluating maximum
scores per window than evaluating candidate matches on this window.

This PR introduces a heuristic that tries to require at least 32 candidate
matches per clause per window to amortize the per-window overhead. This results
in a speedup for the `OrMany` task.
2024-10-22 16:52:36 +02:00
Adrien Grand f8ea130514
Reduce the compiled size of the collect() method on `TopScoreDocCollector`. (#13939)
This comes from observations on https://tantivy-search.github.io/bench/ for
exhaustive evaluation like `TOP_100_COUNT`. `collect()` is often inlined, but
other methods that we'd like to see inlined like `PostingsEnum#nextDoc()` are
not always inlined. This PR decreases the compiled size of `collect()` to make
more room for other methods to be inlined.

It does so by moving an assertion to `AssertingScorable` and extracting an
uncommon code path to a method.
2024-10-22 16:32:28 +02:00
Adrien Grand a779a64d7b
Move BooleanScorer to work on top of Scorers rather than BulkScorers. (#13931)
I was looking at some queries where Lucene performs significantly worse than
Tantivy at https://tantivy-search.github.io/bench/, and found out that we get
quite some overhead from implementing `BooleanScorer` on top of `BulkScorer`
(effectively implemented by `DefaultBulkScorer` since it only runs term queries
as boolean clauses) rather than `Scorer` directly.

The `CountOrHighHigh` and `CountOrHighMed` tasks are a bit noisy on my machine,
so I did 3 runs on wikibigall, and all of them had speedups for these two
tasks, often with a very low p-value.

In theory, this change could make things slower when the inner query has a
specialized bulk scorer, such as `MatchAllDocsQuery` or a conjunction. It does
feel right to optimize for term queries though.
2024-10-21 16:55:04 +02:00
linfn 86457a5f33
Fix StoredFieldsConsumer finish (#13927) 2024-10-21 16:54:13 +02:00
Armin Braun d1e017f192
Speedup OrderIntervalsSource some more (#13937)
Follow-up to #13871, getting another speedup from relatively trivial changes:

* avoid redundant `end()` call by directly storing the end value for sub-iterator that we don't use for anything else
    * also save most `get(...)` calls for this sub-iterator
* avoid redundant `start()` call by grabbing `start()` directly from `nextInterval`
* replace `getFirst()` with `get(0)`, it looks nice but has needless overhead in my testing (not sure why, but profiling clearly shows it to be slower, maybe just a result of having `get()`'s code hot in the cache with a higher likelihood or something esoteric like that)
* avoid using an iterator for loop for a random access list, this is probably the biggest win in this PR
2024-10-21 16:38:12 +02:00
Armin Braun 66f22fa0fd
Simplify PForUtil construction and cleanup its code gen a little (#13932)
Generate cleaner code for PForUtil that has no dead parameters.

Also:
PForUtil instances always create their own `ForUtil`, so we can inline
that into the field declaration. Also, we can save cycles
for accessing the input on PostingsDecodingUtil.

Surprisingly, the combination of these cleanups yields a small but
statistically fully visible speedup that the compiler isn't able to get
to on its own it seems.
2024-10-21 15:10:08 +02:00
Ignacio Vera 05e06e51ec
Use growNoCopy when copying bytes in BytesRefBuilder (#13930) 2024-10-21 07:36:46 +02:00
Michael Sokolov 3983fa2c8d
Add BaseKnnVectorsFormatTestCase.testRecall() and fix old codecs (#13910)
* Add BaseKnnVectorsFormatTestCase.testRecall() and fix map ord to doc in Lucene90HnswVectorsReader
2024-10-17 08:49:56 -07:00
Adrien Grand 1faf33a02a Revert "Better handle dynamic pruning when the leading clause has a single impact block. (#13904)"
This reverts commit 5fd45254d3.
2024-10-16 15:15:06 +02:00
Zhang Chao 789658819f
Remove redundant code in PointInSetQuery (#13905) 2024-10-16 10:33:53 +08:00
Armin Braun 331323f1b9
Avoid slicing memory segments unnecessarily (#13906)
No point in copying the memory segment instances when slicing, they are stateless.
2024-10-15 20:53:54 +02:00
Adrien Grand f69b196ef2
Skip madvise calls on tiny inner files of compound files. (#13917)
This commit skips `madvise` calls on inner files of compound files that are
smaller than the page size.
2024-10-15 16:17:51 +02:00
Adrien Grand 5fd45254d3
Better handle dynamic pruning when the leading clause has a single impact block. (#13904)
`BlockMaxConjunctionBulkScorer` only checks if it can early exit based on
impacts once per window, and windows are computed using impact blocks of the
leading clause. So this logic is defeated if the leading clause produces a
single block (e.g. `ConstantScoreQuery`). This commit addresses this problem by
artificially lowering the window size to contain ~128 docs of the leading
clause.
2024-10-15 16:17:20 +02:00
zhouhui 4d19a5408e
Optimize convert byte2int. (#13889) 2024-10-15 16:12:48 +02:00
Adrien Grand cf29597fec
Make MaxScoreBulkScorer repartition scorers when the min competitive increases. (#13800)
MaxScoreBulkScorer partitions scorers into a set of essential scorers and a set
of non-essential scorers, depending on the maximum scores produced by scorers
and on the current minimum competitive score. An increase of the minimum
competitive score has the potential to yield a more favorable partitioning, but
repartitioning can also be expensive.

In order to repartition when necessary while avoiding to repartition too often,
this PR tracks the minimum value of the minimum competitive score that would
produce a more favorable partitioning, and repartitions scorers whenever the
minimum competitive score exceeds this threshold.
2024-10-15 15:20:34 +02:00
Luca Cavanna 352d85cbe4 Re-enable backwards compatibility tests for version >=10 2024-10-15 15:05:41 +02:00