Commit Graph

37735 Commits

Author SHA1 Message Date
Adrien Grand 17bd129cea Reduce specialization in TopScoreDocCollector. (#14038)
The specialization of `SimpleCollector` vs. `PagingCollector` only helps save a
null check, so it's probably not worth the complexity. Benchmarks cannot see a
difference with this change.
2024-12-04 15:20:18 +01:00
Adrien Grand 4947c0f746 Improve search equivalence tests. (#14036)
This addresses an existing TODO about giving terms a zipfian distribution, and
disables query caching to make sure that two-phase iterators are properly
tested.
2024-12-04 15:20:18 +01:00
Jim Ferenczi 356a534c0b Add support for storing term vectors in FeatureField (#14034)
This update introduces an option to store term vectors generated by the FeatureField.
With this option, term vectors can be used to access all features for each document.
2024-12-04 12:38:32 +00:00
Michael Froh c9c631f9d2 Simplify logic in ScoreCachingWrappingScorer (#14012)
This is functionally equivalent to the logic that was present, but
makes the behavior clearer.
2024-12-03 19:24:59 +01:00
Adrien Grand 02db61ffb3 LUCENE-10073: Reduce merging overhead of NRT by using a greater mergeFactor on tiny segments. (#266)
Closes #11111
2024-12-03 17:55:06 +01:00
Chris Hegarty 290847a80e [10.x] Ensure Panama float vector distance impls inlinable (#14031)
This commit reduces the Panama vector distance float implementations to less than the maximum bytecode size of a hot method to be inlined (325).

E.g. Previously:  org.apache.lucene.internal.vectorization.PanamaVectorUtilSupport::dotProductBody (355 bytes)   failed to inline: callee is too large.

After: org.apache.lucene.internal.vectorization.PanamaVectorUtilSupport::dotProductBody (3xx bytes)   inline (hot)

This helps things a little.

Co-authored-by: Robert Muir <rmuir@apache.org>
2024-12-03 10:50:56 +00:00
Adrien Grand 8762de7f11 Speed up PostingsEnum when reading positions. (#14032)
This PR changes the following:
 - As much work as possible is moved from `nextDoc()`/`advance()` to
   `nextPosition()`. This helps only pay the overhead of reading positions when
   all query terms agree on a candidate.
 - Frequencies are read lazily. Again, this helps in case a document is needed
   in a block, but clauses do not agree on a common candidate match, so
   frequencies are never decoded.
 - A few other minor optimizations.
2024-12-02 23:26:19 +01:00
Luca Cavanna 4783c05cc7 adjust changelog for #14027 2024-12-02 10:34:01 +01:00
Luca Cavanna c8018b220d Make SegmentInfos#readCommit(Directory, String, int) public (#14027)
The corresponding readLatestCommit method is public and can be used to
read segment infos from indices that are older than N - 1.
The same should be possible for readCommit, but that requires the method
that takes the minimum supported version as an argument to be public.
2024-12-02 10:25:42 +01:00
Adrien Grand b732543b57 Rewrite queries with no SHOULD clauses and minimumShouldMatch > 0 to a MatchNoDocsQuery.
Closes #14026
2024-11-29 14:49:36 +01:00
Adrien Grand c44b3f9338 Make inlining decisions a bit more predictable in our main queries. (#14023)
This implements a small contained hack to make sure that our compound scorers
like `MaxScoreBulkScorer`, `ConjunctionBulkScorer`,
`BlockMaxConjunctionBulkScorer`, `WANDScorer` and `ConjunctionDISI` only have
two concrete implementations of `DocIdSetIterator` and `Scorable` to deal with.

This helps because it makes calls to `DocIdSetIterator#nextDoc()`,
`DocIdSetIterator#advance(int)` and `Scorable#score()` bimorphic at most, and
bimorphic calls are candidate for inlining.

This should help speed up boolean queries of term queries at the expense of
boolean queries of other query types. This feels fair to me as it gives more
speedups than slowdowns in benchmarks, and that boolean queries of term queries
are extremely typical. Boolean queries that mix term queries and other types of
queries may get a slowdown or a speedup depending on whether they get more from
the speedup on their term clauses than they lose on their other clauses.
2024-11-29 13:28:05 +01:00
ChrisHegarty 365ffdeb57 add missing changes log entry for 13998 2024-11-29 10:32:59 +00:00
Chris Hegarty b7957ff090 Add IndexInput isLoaded (#13998)
This commit adds IndexInput::isLoaded to help determine if the contents of an input is resident in physical memory.

The intent of this new method is to help build inspection and diagnostic infrastructure on top.
2024-11-29 10:29:00 +00:00
Adrien Grand c529c49c3e Run filtered disjunctions with MaxScoreBulkScorer. (#14014)
Running filtered disjunctions with a specialized bulk scorer seems to yield a
good speedup. For what it's worth, I also tried to implement a MAXSCORE-based
scorer to see if it had to do with the `BulkScorer` specialization or the
algorithm, but it didn't help.

To work properly, I had to add a rewrite rule to inline disjunctions in a MUST
clause.

As a next step, it would be interesting to see if we can further optimize this
by loading the filter into a bitset and applying it like live docs.
2024-11-27 21:57:17 +01:00
Adrien Grand 3f620dcd34 Make WANDScorer compute scores on the fly. (#14021)
Currently, `WANDSCorer` considers that a hit is a match if the sum of maximum
scores across clauses is more than or equal to the minimum competitive score.
We can do better by computing scores of leading clauses on the fly. This helps
because scores are often lower than the score upper bound, so using actual
scores instead of score upper bounds can help skip advancing more clauses.

For reference, we are already doing the same trick in our conjunction (bulk)
scorers and in `MaxScoreBulkScorer` (bulk scorer for top-level disjunctions).
2024-11-27 21:57:13 +01:00
Jean-François BOEUF 71715b59e8 Improve checksum calculations (#13989)
Take advantage of the existing buffer in BufferedChecksum to speed up
reads for Longs, Ints, Shorts and Long arrays by avoiding byte-by-byte
reads.
2024-11-25 15:59:35 +01:00
Adrien Grand d9c3bc875b Stop using `SlowImpactsEnum` for terms whose `docFreq` is less than 128. (#14017)
We currently use `SlowImpactsEnum` for terms whose `docFreq` is less than 128
because it's convenient as these terms don't have impacts anyway. But a recent
slowdown on nightly benchmarks suggests that this contributes to making some
hot calls more polymorphic than we'd like, so this PR moves such terms back to
the regular impacts enums.
2024-11-25 15:48:45 +01:00
Adrien Grand b12404b09b Make CombinedFieldQuery eligible for WAND/MAXSCORE. (#13999)
`CombinedFieldQuery` currently returns an infinite maximum score. We can do
better by returning the maximum score that the sim scorer can return, which in
the case of BM25 is bounded by the IDF. This makes CombinedFieldQuery eligible
for WAND/MAXSCORE (not their block-max variants though, since we return the
same score upper bound for the whole index).
2024-11-25 15:48:41 +01:00
Adrien Grand 7d5ea247f9 Only consider clauses whose cost is less than the lead cost to compute block boundaries in WANDScorer. (#14003)
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-25 15:48:41 +01:00
Stefan Vodita 4f682ae6af Fix changelog for GITHUB#14008 2024-11-23 12:52:02 +00:00
Paul King aa040d5230 Taxonomy counts are incorrect due to ordinal sorting (#14008) (#14010) 2024-11-23 12:04:49 +00:00
Sascha Szott cbec73e4c3 fix JavaDoc: TopDocs instead of Hits (#14015) 2024-11-22 16:01:20 -08:00
Tejas Shah 7c5a9deaf9 Introduces IndexInput#updateReadAdvice to change the ReadAdvice while merging vectors (#13985)
The commit updates the ReadAdvice.SEQUENTIAL before the merge starts and reverts it to ReadAdvice.RANDOM at the end of the merge for Lucene99FlatVectorsReader.
2024-11-22 12:15:51 +00:00
Paul King 816b5fa3c3 Update ComplexPhraseQueryParser.java (#14005)
Fix typo
2024-11-22 00:48:19 +00:00
Adrien Grand b70d214217 Revert "Only consider clauses whose cost is less than the lead cost to compute block boundaries in WANDScorer. (#14000)"
This reverts commit 5807ff1620.
2024-11-20 10:17:05 +01:00
Adrien Grand a67120e175 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:54:25 +01:00
Adrien Grand d6afdc4a25 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:54:25 +01:00
Viswanath Kuchibhotla c96ec0be67 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:45:59 -05:00
Adrien Grand cf27af1416 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:54 +01:00
Lu Xugang a5d44d89eb 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:11:04 +08:00
Chris Hegarty 98918aa223 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:48 +00:00
Adrien Grand ffc94df1c2 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:39:12 +01:00
Ignacio Vera ae92ce34c0 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:53 +01:00
Adrien Grand 6e78f379d9 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:35:07 +01:00
Armin Braun 8ed71b3e1c 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:44:43 +01:00
Adrien Grand 9a14d573c8 Adjust expectations of TestTopFieldCollectorEarlyTermination after #13943. 2024-11-05 23:54:07 +01:00
Adrien Grand 48026bbc25 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:37:36 +01:00
Ignacio Vera 7f50732cc3 Avoid performance regression by constructing lazily the PointTree in NumericComparator (#13498) (#13877) 2024-11-05 12:11:25 +01:00
Luca Cavanna 7e97503eef 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:01:29 +01:00
Greg Miller c29dd588e4 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:13:26 -08:00
Adrien Grand 8ae03d66ad 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-04 18:40:53 +01:00
panguixin 584387a254 Replace Map<String,Object> with IntObjectHashMap for KnnVectorsReader (#13763) 2024-10-31 16:16:44 +01:00
Adrien Grand cff28d546f 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-31 16:16:44 +01:00
Adrien Grand 8b87527f03 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:17:08 +01:00
panguixin 4581add24b replace Map<String,Object> with IntObjectHashMap for DV producer (#13961) 2024-10-29 17:34:06 +01:00
Adrien Grand af9177a598 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:52:13 +01:00
Adrien Grand 054c60e83b 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:48:19 +02:00
ljak 0e918ce9bb Ensure stability of clause order for DisjunctionMaxQuery toString (#13944)
Co-authored-by: Laurent <jakubinal@lexum.com>
2024-10-25 18:22:22 +02:00
Adrien Grand 9fb87b606b 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:26 +02:00
Benjamin Trent ef2b8131cf Ensure doc order for TestCommonTermsQuery#testMinShouldMatch (#13953) 2024-10-25 07:43:26 -04:00