Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
1ca6728
docs(iris): MOD-19267 document both https endpoints for the RAM FIPS …
gudata Oct 8, 2026
b85be81
Clarify RDI snapshot modes and missed deletes
ZdravkoDonev-redis Oct 9, 2026
48a06a3
Add missed-delete timeline to the RDI Cloud FAQ
ZdravkoDonev-redis Oct 9, 2026
2c2504a
Address snapshot documentation review comments
ZdravkoDonev-redis Oct 9, 2026
f6d2bb1
Address RDI snapshot mode review comments
ZdravkoDonev-redis Oct 13, 2026
e4bb092
Address additional RDI review comments
ZdravkoDonev-redis Oct 13, 2026
d87ebb8
Clarify RDI source restart behavior
ZdravkoDonev-redis Oct 13, 2026
a252aa4
DOC: clarify PostgreSQL publication setup for RDI
ZdravkoDonev-redis Oct 15, 2026
1aef807
DOC: update versioned RDI PostgreSQL guidance
ZdravkoDonev-redis Oct 15, 2026
75545b2
DOC: address PostgreSQL publication review comments
ZdravkoDonev-redis Oct 15, 2026
7ec2c7d
Remove LangCache links and named mentions from Iris landing and conce…
mich-elle-luna Oct 15, 2026
1836664
DEV: misc. doc changes for Redis Search in 8.10 (#4279)
dwdougherty Oct 15, 2026
5d99c24
Merge pull request #4280 from redis/langcache-move
mich-elle-luna Oct 15, 2026
c059286
DOC-7182: Add an interactive demo for Redis Search queries (#4271)
paoloredis Oct 16, 2026
62264c8
DOC-6836 Update Lettuce AMR snippets for the Lettuce 7.9 credentials …
andy-stark-redis Oct 16, 2026
44fd321
Update redirect-endpoints.md
NoamSternRedis Oct 16, 2026
dbe630b
Update content/operate/rc/api/api-reference/openapi.json (#4281)
github-actions[bot] Oct 16, 2026
3d65553
clarify BITPOS behavior on non-existent vs empty keys (#4282)
itsMathew Oct 16, 2026
8f68fe3
DOC-7196 Add HIMPORT bulk-import step to client index/query pages (#4…
andy-stark-redis Oct 16, 2026
de6d1e1
DOC-7197 Fix stale output comments, Jedis constructor, and install pi…
andy-stark-redis Oct 16, 2026
404f77d
DOC-7197 Fix Lettuce, Go, and PHP vecsearch examples and Go queryjson…
andy-stark-redis Oct 16, 2026
3b030c7
Merge pull request #4283 from redis/NoamSternRedis-patch-2
mich-elle-luna Oct 16, 2026
143558e
Explain RDI CDC offsets and source retention
ZdravkoDonev-redis Oct 17, 2026
9cfb187
Restyle CDC retention timelines with Redis docs design
ZdravkoDonev-redis Oct 17, 2026
aa7ce3c
Explain source-specific CDC history and state failures
ZdravkoDonev-redis Oct 17, 2026
9ebbfb7
Clarify MongoDB change streams and pre-image requirements
ZdravkoDonev-redis Oct 17, 2026
8458e46
Identify Oracle as the example source in CDC introduction
ZdravkoDonev-redis Oct 17, 2026
9e5d620
Introduce processing before linking to checkpointing
ZdravkoDonev-redis Oct 18, 2026
83cd92a
Clarify source retention controls and replay limits
ZdravkoDonev-redis Oct 18, 2026
d4cdff7
Clarify snapshot-only restarts and Snowflake recovery
ZdravkoDonev-redis Oct 18, 2026
d303acb
DOC: align Cloud PostgreSQL publications and replica identity guidance
ZdravkoDonev-redis Oct 18, 2026
731b433
RDSC-6239: Clarify Aurora future table grants
ZdravkoDonev-redis Oct 18, 2026
fa635c7
RDSC-6239: Correct database PrivateLink setup instructions
ZdravkoDonev-redis Oct 18, 2026
01a1a43
RDSC-6238: Check usable replica identity indexes in PostgreSQL guidance
ZdravkoDonev-redis Oct 18, 2026
e3bb66e
Correct Snowflake timestamp recovery and retention guidance
ZdravkoDonev-redis Oct 18, 2026
41fd169
Document that GET /v1/actions/bdb does not return completed actions
zviRosenfeldRedis Oct 18, 2026
e53775d
update rc openapi spec (#4291)
github-actions[bot] Oct 19, 2026
a55d8d1
Merge pull request #4295 from zviRosenfeldRedis/zvir/actions-bdb-no-c…
mich-elle-luna Oct 19, 2026
cc5703f
RDSC-6239: Cover future table grants for all PostgreSQL setups
ZdravkoDonev-redis Oct 19, 2026
7059139
RDSC-6239: Explain future table grants with three roles in docs
ZdravkoDonev-redis Oct 19, 2026
b3eac29
RDSC-6239: Show direct PrivateLink connectivity and Lambda updates
ZdravkoDonev-redis Oct 19, 2026
c13720f
RDSC-6239: Match PrivateLink diagram to Redis visual style
ZdravkoDonev-redis Oct 19, 2026
f9d3c3e
RDSC-6239: Use original Redis icons in PrivateLink diagram
ZdravkoDonev-redis Oct 19, 2026
16a1043
RS 8.0.20-127 and K8s 8.0.20-28 release notes (#4297)
kaitlynmichael Oct 19, 2026
fdad3ab
RS: fix release weights (#4298)
kaitlynmichael Oct 19, 2026
6bd6d86
K8s: 8.2.0 version (#4276)
kaitlynmichael Oct 19, 2026
f0c6168
K8s: 7.22.2-47 yellow submarine maint 14 (#4301)
kaitlynmichael Oct 19, 2026
ccca67e
RS: 7.22.2-204 (#4299)
kaitlynmichael Oct 19, 2026
862bed7
DOC-7201: Add a Previous button to the scripted demos (#4296)
paoloredis Oct 20, 2026
fb9d04e
Update content/operate/rc/api/api-reference/openapi.json (#4302)
github-actions[bot] Oct 20, 2026
84a13bc
Expand Cloud RDI database throughput guidance with memory and shard s…
orhanabdula-prog Oct 20, 2026
e06333b
RS: 8.2.0-125 RN (#4310)
kaitlynmichael Oct 20, 2026
dbe7d5f
K8s: duckberg maint 8.2.0-19 (#4311)
kaitlynmichael Oct 20, 2026
37be9d8
Correct RDI pipeline hash slot placement and link to RDI database thr…
orhanabdula-prog Oct 21, 2026
6f63ac4
docs(iris): MOD-19813 Agent Memory self-managed docs for the iris-ide…
gudata Oct 15, 2026
6d6e397
docs: MOD-19813 install Memory with a standalone Identity Service
gudata Oct 21, 2026
fd30d51
Update content/operate/rc/api/api-reference/openapi.json (#4315)
github-actions[bot] Oct 21, 2026
04a0aa1
docs: MOD-19813 align authentication and operations with separate rel…
gudata Oct 21, 2026
48e1291
docs: MOD-19813 reconcile the FIPS branch with standalone identity
gudata Oct 21, 2026
0ccff6c
Merge pull request #4238 from redis/docs/rdi-snapshot-modes-and-misse…
mich-elle-luna Oct 21, 2026
c4e1b17
Merge pull request #4273 from redis/docs/rdi-postgresql-publication-s…
mich-elle-luna Oct 21, 2026
c08ec1b
Merge pull request #4292 from redis/rdi-cdc-offsets-retention
mich-elle-luna Oct 21, 2026
8975ce9
Merge branch 'main' into RDSC-6239-aurora-grants
mich-elle-luna Oct 21, 2026
07c8b52
Merge pull request #4294 from redis/RDSC-6239-aurora-networking
mich-elle-luna Oct 21, 2026
65dd861
Merge pull request #4227 from redis/MOD-19267-fips-https-validator-docs
mich-elle-luna Oct 21, 2026
1edb304
docs: MOD-19813 fix deployed documentation report findings
gudata Oct 21, 2026
b01b5d9
Merge pull request #4293 from redis/RDSC-6239-aurora-grants
mich-elle-luna Oct 21, 2026
691746b
Merge pull request #4307 from orhanabdula-prog/claude/rdi-database-th…
mich-elle-luna Oct 21, 2026
8c0a67b
chore: merge main after FIPS documentation lands
gudata Oct 21, 2026
bcb8731
Merge pull request #4272 from redis/MOD-19272-ids-subchart-docs
mich-elle-luna Oct 21, 2026
fb79283
OP: add 8.12-RC1 release notes (#4314)
dwdougherty Oct 21, 2026
4eb3e30
DOC-7184: Answer "Ask AI to explain this page" in a pane beside the p…
paoloredis Oct 22, 2026
717a4dd
DOC-7198 Fix Go vecsets for hugot v0.7.7 and close harness pom gaps (…
andy-stark-redis Oct 22, 2026
95ce8ba
DOC-7198 Sort query3 by city in all clients, fix Go vecsets steps, an…
andy-stark-redis Oct 22, 2026
115a3c5
Update content/operate/rc/api/api-reference/openapi.json (#4322)
github-actions[bot] Oct 22, 2026
54f4876
Link Redis Iris from the rest of the docs
mich-elle-luna Oct 22, 2026
c22645e
Merge pull request #4327 from redis/iris-links
mich-elle-luna Oct 22, 2026
deca3a0
DOC-7218 Fix AI chatbot pane ratings missing from DocuSight (#4334)
paoloredis Oct 23, 2026
296b88b
Update content/operate/rc/api/api-reference/openapi.json (#4328)
github-actions[bot] Oct 23, 2026
992808f
DOC-7208 Remove the license section from the RDI FAQ
andy-stark-redis Oct 23, 2026
612ff69
DOC-7216 Correct the VisuaLeaf and Beekeeper Studio third-party tool …
andy-stark-redis Oct 23, 2026
683d384
DOC-7221 Pin RDI 1.19.1 install docs to v1.19.1 downloads
andy-stark-redis Oct 23, 2026
10adbde
DOC-7219 Add a /vet-redis-tool skill for vetting third-party Redis tools
andy-stark-redis Oct 23, 2026
40ce405
Fix context-map diagram links missing the /docs/latest/ prefix
mich-elle-luna Oct 23, 2026
ecac70b
DEV: (cmds) correct PING return info (#4340)
dwdougherty Oct 23, 2026
8da7f68
Merge pull request #4342 from redis/flow-diagram-link-fix
mich-elle-luna Oct 23, 2026
4fe762f
Update content/operate/rc/api/api-reference/openapi.json (#4344)
github-actions[bot] Oct 25, 2026
fcc15c7
Update content/operate/rc/api/api-reference/openapi.json (#4345)
github-actions[bot] Oct 26, 2026
687c6e4
RS: Add upgrade warning for deprecated gradual sync parameters (#4275)
kaitlynmichael Oct 26, 2026
a37507e
RS: gradual sync policies (#4253)
kaitlynmichael Oct 26, 2026
e5667ac
OP/RS: correct Redis Search limitation with Redis Software (#4346)
dwdougherty Oct 26, 2026
46c971d
K8s: Eden supported distros update
kaitlynmichael Oct 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions .claude/skills/tce-examples/reference/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,15 +130,36 @@ The portable pins lag the newest commands. As of DOC-7172 (HIMPORT, Redis 8.10),
portable pins predated the first release with the command: jedis 7.5.3 (needs 8.0.0),
lettuce-core 6.5.5 in `pom-lettuce-sync.xml` (needs 7.7.0; the async and reactive poms are
already on 7.7.0), StackExchange.Redis 3.0.0 in `dotnet/harness.csproj` (needs 3.0.25),
the cached `npm i redis` 6.1.0 (needs 6.2.0) and ioredis 5.11.1 (needs 6.0.0) in `work/`,
and go-redis v9.18.0 in `fidelity/go-redis.mod` (needs 9.22.0, which also needs Go 1.24).
the cached `npm i redis` 6.1.0 (needs 6.2.0), and ioredis 5.11.1 (needs 6.0.0) in `work/`.

The go-redis pin in `fidelity/go-redis.mod` was raised to v9.22.0 (`go 1.24`) in DOC-7197,
so it now supports HIMPORT. On a machine whose Go toolchain is older than 1.24, `run.sh`
reports every Go set as SKIP rather than running it.

A run against those pins fails with "method not found" or "unknown command", which looks
like an example bug but is a pin gap. Until the pins are raised (a separate change, because
raising them can break other sets), test such a set outside `run.sh`. Give each client a
scratch project pinned to its first supporting release, with its own throwaway
`redis:<version>` container on a spare port, and change the port only in the scratch copy.

## Run twice: state that survives a rerun

Some server-side state outlives the example that created it, so one green run proves less
than it seems. Compact hashes (`HIMPORT`, Redis 8.10) are the known case (DOC-7196):

- A compact hash returns its fields in a different order from the declared one (age, city,
name, email for the search examples), so any print or assert of a whole hash or search
document changes. Queries that `RETURN` named fields are unaffected.
- `HSET` on a key that's already a compact hash keeps it compact. An example that
re-creates its keys without deleting them first passes on a clean server and fails on the
second run.

Run any example that touches compact hashes **twice in a row against the same server**.
If the second run differs, add a hidden `REMOVE` delete of the keys after the connect step.
When an example rewrites identical values over existing keys, also run a copy with the
original write removed. Otherwise a stale index or cached value can produce the expected
output on its own.

## Codex evaluation (Phase 4)

An independent reviewer with fresh context. It catches what the harness structurally cannot:
Expand Down
223 changes: 223 additions & 0 deletions .claude/skills/vet-redis-tool/SKILL.md

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions build/example-test-harness/fidelity/go-redis.mod
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
module redis_examples

go 1.21
go 1.24

require github.com/redis/go-redis/v9 v9.18.0
require github.com/redis/go-redis/v9 v9.22.0

require (
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
go.uber.org/atomic v1.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
)
15 changes: 15 additions & 0 deletions build/example-test-harness/fidelity/pom-jedis.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,21 @@
<version>5.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>ai.djl.huggingface</groupId>
<artifactId>tokenizers</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-engine</artifactId>
<version>0.33.0</version>
</dependency>
</dependencies>

<build>
Expand Down
17 changes: 16 additions & 1 deletion build/example-test-harness/fidelity/pom-lettuce-async.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,22 @@
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>7.4.0.RELEASE</version>
<version>7.7.0.RELEASE</version>
</dependency>
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>ai.djl.huggingface</groupId>
<artifactId>tokenizers</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-engine</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
Expand Down
17 changes: 16 additions & 1 deletion build/example-test-harness/fidelity/pom-lettuce-reactive.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,28 @@
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>7.4.0.RELEASE</version>
<version>7.7.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>ai.djl.huggingface</groupId>
<artifactId>tokenizers</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-engine</artifactId>
<version>0.33.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
Expand Down
3 changes: 3 additions & 0 deletions build/example-test-harness/pom-jedis.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
<properties><maven.compiler.release>17</maven.compiler.release><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
<dependencies>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>7.5.3</version></dependency>
<dependency><groupId>ai.djl</groupId><artifactId>api</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>ai.djl.huggingface</groupId><artifactId>tokenizers</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>ai.djl.pytorch</groupId><artifactId>pytorch-engine</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.2</version><scope>test</scope></dependency>
<dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.25.3</version><scope>test</scope></dependency>
</dependencies>
Expand Down
3 changes: 3 additions & 0 deletions build/example-test-harness/pom-lettuce-async.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
<dependencies>
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>7.7.0.RELEASE</version></dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.1</version></dependency>
<dependency><groupId>ai.djl</groupId><artifactId>api</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>ai.djl.huggingface</groupId><artifactId>tokenizers</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>ai.djl.pytorch</groupId><artifactId>pytorch-engine</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.2</version><scope>test</scope></dependency>
<dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.25.3</version><scope>test</scope></dependency>
</dependencies>
Expand Down
3 changes: 3 additions & 0 deletions build/example-test-harness/pom-lettuce-reactive.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
<dependencies>
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>7.7.0.RELEASE</version></dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.1</version></dependency>
<dependency><groupId>ai.djl</groupId><artifactId>api</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>ai.djl.huggingface</groupId><artifactId>tokenizers</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>ai.djl.pytorch</groupId><artifactId>pytorch-engine</artifactId><version>0.33.0</version></dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.2</version><scope>test</scope></dependency>
<dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.25.3</version><scope>test</scope></dependency>
</dependencies>
Expand Down
42 changes: 42 additions & 0 deletions build/test_version_archiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,46 @@ def test_other_products_use_their_own_prefix():
print("✓ redis-data-integration (integrate prefix) is versioned")


def test_links_into_older_versions_untouched():
"""A link from latest into an older snapshot must keep pointing there.

Archiving kubernetes 8.2.0 turned /content/operate/kubernetes/7.22/... into
/content/operate/kubernetes/8.2.0/7.22/..., which does not exist.
"""
both = ('[m]({{< relref "/operate/kubernetes/7.22/re-clusters/auto-tiering" >}})\n'
'[n](/content/operate/kubernetes/7.22/re-clusters/auto-tiering.md)')
out = archive("kubernetes", "8.2.0", DEEP, both)
assert out == both, out
print("✓ links into older version directories are left alone")


def test_agent_and_os_files_not_copied():
"""Agent instruction files, .DS_Store and hidden dirs (.claude/) stay out of a version."""
cwd = os.getcwd()
with tempfile.TemporaryDirectory() as tmp:
os.chdir(tmp)
try:
archiver = VersionArchiver("kubernetes", "9.9")
sub = os.path.join(archiver.latest, "flex")
os.makedirs(sub)
for name in ("AGENTS.md", "CLAUDE.md", "CLAUDE.local.md", ".DS_Store", "_index.md"):
open(os.path.join(archiver.latest, name), "w").close()
open(os.path.join(sub, "AGENTS.md"), "w").close()
open(os.path.join(sub, "plan.md"), "w").close()
hidden = os.path.join(sub, ".claude")
os.makedirs(hidden)
open(os.path.join(hidden, "state"), "w").close()
archiver.archive_version()
copied = sorted(
os.path.relpath(os.path.join(r, f), archiver.new_directory)
for r, _, fs in os.walk(archiver.new_directory) for f in fs
)
finally:
os.chdir(cwd)
assert copied == ["_index.md", os.path.join("flex", "plan.md")], copied
print("✓ agent instruction and OS files are not copied into the version")


def main():
tests = [
test_relref_is_versioned,
Expand All @@ -141,6 +181,8 @@ def main():
test_already_versioned_is_idempotent,
test_other_product_and_external_urls_untouched,
test_other_products_use_their_own_prefix,
test_links_into_older_versions_untouched,
test_agent_and_os_files_not_copied,
]
try:
for t in tests:
Expand Down
27 changes: 21 additions & 6 deletions build/version_archiver.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
import os, shutil, re, argparse

# Files that live in the latest tree but are not documentation. Agent
# instruction files are loaded by directory, so a frozen copy inside a version
# would shadow the live rules for anyone editing that version.
EXCLUDED_FILES = {"AGENTS.md", "CLAUDE.md", "CLAUDE.local.md", ".DS_Store"}


def is_version_dir(name):
"""Same rule archive_version uses to skip other releases: any digit."""
return any(char.isdigit() for char in name)


class VersionArchiver:
def __init__(self, product, version):
Expand All @@ -24,7 +34,9 @@ def archive_version(self):
dirs[:] = [
d
for d in dirs
if not any(char.isdigit() for char in d) and d != "release-notes"
if not is_version_dir(d)
and d != "release-notes"
and not d.startswith(".") # local tool state such as .claude/
]

# Create the corresponding destination directory if it does not exist
Expand All @@ -34,6 +46,8 @@ def archive_version(self):
os.makedirs(dest_dir)

for file in files:
if file in EXCLUDED_FILES:
continue
src_file = os.path.join(root, file)
dest_file = os.path.join(dest_dir, file)
shutil.copy2(src_file, dest_file)
Expand Down Expand Up @@ -74,11 +88,12 @@ def replace_link(match):
full_match = match.group(0) # The entire match
link = match.group(1) # The actual relref link

# Check if the link contains 'release-notes' and whether the replacement has already happened
if (
"release-notes" not in link
and f"/{self.prefix}/{product}/{version}" not in link
):
# Leave release notes alone, and any link that already points
# into a version directory: this one (idempotency) or an older
# snapshot such as 7.22/, which must not become <version>/7.22/.
after_product = link.split(f"/{self.prefix}/{product}/", 1)[-1]
first_segment = after_product.split("/", 1)[0]
if "release-notes" not in link and not is_version_dir(first_segment):
# Otherwise, replace it
new_link = link.replace(
f"/{self.prefix}/{product}/",
Expand Down
2 changes: 1 addition & 1 deletion content/commands/bitpos.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ order to index bytes starting from the end of the string, where -1 is the last
byte, -2 is the penultimate, and so forth. When `BIT` is specified, -1 is the last
bit, -2 is the penultimate, and so forth.

Non-existent keys are treated as empty strings.
If the key does not exist, it is treated as an infinite array of zero bits: searching for a clear bit (0) returns 0, while searching for a set bit (1) returns -1. In contrast, an existing empty string (a key holding "") contains no bits at all, so searching for either 0 or 1 always returns -1.

## Required arguments

Expand Down
63 changes: 58 additions & 5 deletions content/commands/ft.hybrid.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,10 @@ arguments:
name: sorting
optional: true
type: oneof
- name: explainscore
optional: true
token: EXPLAINSCORE
type: pure-token
- arguments:
- name: params
token: PARAMS
Expand Down Expand Up @@ -514,7 +518,7 @@ syntax_fmt: "FT.HYBRID index\n SEARCH query\n [SCORER scorer]\n [YIELD_SC
\ nargs property [property ...]\n [GROUPBY nargs property [property ...]\n \
\ [REDUCE function nargs arg [arg ...] [AS name]\n [REDUCE function nargs arg\
\ [arg ...] [AS name] ...]] ...]]\n [APPLY expression AS name [APPLY expression\
\ AS name ...]]\n [FILTER filter]\n PARAMS nargs vector_param vector_blob [name\
\ AS name ...]]\n [FILTER filter]\n [EXPLAINSCORE]\n PARAMS nargs vector_param vector_blob [name\
\ value ...]\n [TIMEOUT timeout]"
title: FT.HYBRID
---
Expand Down Expand Up @@ -657,16 +661,26 @@ defines parameter substitution for the query. Parameters can be referenced in se
Example: `PARAMS 4 min_price 50 max_price 200`
</details>

<!--<details open>
<details open>
<summary><code>EXPLAINSCORE</code></summary>

includes detailed score explanations in the results, showing how both text search and vector similarity scores were calculated and combined.
</details>-->
returns an explanation of how each result's combined score was calculated. Available in Redis 8.10 and later.

Each result gets a `score` field holding a two-element array: the combined score, followed by a nested explanation tree. You don't need `WITHSCORES`. The tree shows:

- The final score formula and the fusion method with its parameters: `RRF` with `window` and `constant`, or `LINEAR` with `alpha`, `beta`, and `window`.
- The text branch: the scorer name, such as `BM25STD`, and the scorer's own breakdown. With `RRF`, it shows the text rank. With `LINEAR`, it shows the text contribution and the normalized text score.
- The vector branch: `KNN` or `RANGE` with its radius and epsilon. With `RRF`, it shows the vector rank. With `LINEAR`, it shows the vector contribution and the normalized vector score. `RANGE` also shows whether the document matched within the radius.

A branch that didn't match the document shows `<no match>`.

`EXPLAINSCORE` can't be combined with `GROUPBY`. The command returns the error `EXPLAINSCORE is not supported with GROUPBY`.
</details>

<details open>
<summary><code>TIMEOUT timeout</code></summary>

sets a runtime timeout for the query execution in milliseconds.
sets a runtime timeout for the query execution in milliseconds. When the query times out, the [`search-on-timeout`](/content/develop/ai/search-and-query/administration/configuration.md#search-on-timeout) policy applies. With `RETURN` or `RETURN_STRICT`, the command returns the results accumulated so far and reports the timeout in `warnings`. With `FAIL`, it returns an error.
</details>

<!--<details open>
Expand Down Expand Up @@ -779,6 +793,45 @@ Use parameter substitution for dynamic queries:
{{< / highlight >}}
</details>

<details open>
<summary><b>Explain hybrid scores</b></summary>

Return the top result with an explanation of its RRF score. The document ranked first in both the text and vector branches:

{{< highlight bash >}}
127.0.0.1:6379> FT.HYBRID products-idx
SEARCH "shoes"
VSIM @embedding $query_vec
KNN 2 K 3
EXPLAINSCORE
LIMIT 0 1
PARAMS 2 query_vec <vector_blob>
1) total_results
2) (integer) 3
3) results
4) 1) 1) score
2) 1) "0.03278688524590164"
2) 1) final score: 1 / (constant 60.00 + rank 1) + 1 / (constant 60.00 + rank 1) = 0.032786885245901641
2) 1) 1) Hybrid score (RRF: window=20, constant=60.00)
2) 1) 1) text rank = 1
2) 1) 1) Text scorer: BM25STD
2) 1) 1) Final BM25 : words BM25 1.39 * document score 1.00
2) 1) 1) (Weight 1.00 * children BM25 1.39)
2) 1) shoes: (0.69 = Weight 1.00 * IDF 0.69 * (F 1.00 * (k1 1.2 + 1)) / (F 1.00 + k1 1.2 * (1 - b 0.75 + b 0.75 * Doc Len 3 / Average Doc Len 3.00)))
2) +shoe: (0.69 = Weight 1.00 * IDF 0.69 * (F 1.00 * (k1 1.2 + 1)) / (F 1.00 + k1 1.2 * (1 - b 0.75 + b 0.75 * Doc Len 3 / Average Doc Len 3.00)))
2) 1) vector branch (KNN)
2) 1) vector rank = 1
3) "__key"
4) "product:1"
5) "__score"
6) "0.0327868852459"
5) warnings
6) (empty array)
7) execution_time
8) "2.0055"
{{< / highlight >}}
</details>

## Complexity

FT.HYBRID complexity depends on both the text search and vector similarity components:
Expand Down
Loading
Loading