From 6270102fcad37de9bf408bc4cfd623869b6f892d Mon Sep 17 00:00:00 2001 From: Brian Sam-Bodden Date: Wed, 18 Feb 2026 16:34:23 -0800 Subject: [PATCH] fix: update hybrid query notebooks --- notebooks/02_hybrid_queries.ipynb | 251 +++++++++++- notebooks/11_advanced_queries.ipynb | 583 +++++++++++++++------------- 2 files changed, 561 insertions(+), 273 deletions(-) diff --git a/notebooks/02_hybrid_queries.ipynb b/notebooks/02_hybrid_queries.ipynb index 99ae6b8..384e906 100644 --- a/notebooks/02_hybrid_queries.ipynb +++ b/notebooks/02_hybrid_queries.ipynb @@ -1335,6 +1335,252 @@ "In some cases, you may need to use a filter expression to execute a `CountQuery` that simply returns the count of the number of entities in the pertaining set. The `count()` method provides efficient server-side counting without retrieving the actual documents." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## True Hybrid Search: Text + Vector Scoring\n", + "\n", + "The queries above demonstrate **filtered vector search** — they use metadata filters (tag, numeric, geo) to narrow down candidates, but scoring is based solely on vector similarity.\n", + "\n", + "**True hybrid search** combines **text relevance (BM25)** AND **vector similarity** scoring in a single query. This means results are ranked by both how well they match keywords and how semantically similar they are to the query vector.\n", + "\n", + "RedisVL provides two hybrid search implementations:\n", + "- **`HybridQuery`** — Uses the native `FT.HYBRID` command (Redis 8.4+). Supports RRF and LINEAR score fusion.\n", + "- **`AggregateHybridQuery`** — Uses `FT.AGGREGATE` (Redis 7.4+). Weighted linear score combination." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HybridQuery and AggregateHybridQuery imported successfully!\n" + ] + } + ], + "source": [ + "// Import HybridQuery and AggregateHybridQuery classes\n", + "import com.redis.vl.query.HybridQuery;\n", + "import com.redis.vl.query.AggregateHybridQuery;\n", + "\n", + "System.out.println(\"HybridQuery and AggregateHybridQuery imported successfully!\");" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HybridQuery results (text='engineer', default RRF combination):\n", + "┌────────────┬───────────────┬─────────────┬──────────────┬─────────────┬─────────────┬───────┬─────────────────┬───┐\n", + "│credit_score│vector_distance│text_score │hybrid_score │job │__score │user │vector_similarity│age│\n", + "├────────────┼───────────────┼─────────────┼──────────────┼─────────────┼─────────────┼───────┼─────────────────┼───┤\n", + "│high │0 │2.32630164941│1.39789049482 │engineer │2.32630164941│john │1 │18 │\n", + "│high │0.109129190445 │2.32630164941│1.35969527817 │engineer │2.32630164941│tyler │0.945435404778 │100│\n", + "│low │0 │0 │0.7 │doctor │0 │derrick│1 │14 │\n", + "│high │0.158808887005 │0 │0.644416889548│dermatologist│0 │tim │0.920595556498 │12 │\n", + "│low │0.217881977558 │0 │0.623741307855│CEO │0 │taimur │0.891059011221 │15 │\n", + "└────────────┴───────────────┴─────────────┴──────────────┴─────────────┴─────────────┴───────┴─────────────────┴───┘\n" + ] + } + ], + "source": [ + "// HybridQuery with default combination (RRF)\n", + "// Searches the \"job\" text field and \"user_embedding\" vector field simultaneously\n", + "HybridQuery hybridQuery = HybridQuery.builder()\n", + " .text(\"engineer\")\n", + " .textFieldName(\"job\")\n", + " .vector(new float[]{0.1f, 0.1f, 0.5f})\n", + " .vectorFieldName(\"user_embedding\")\n", + " .returnFields(List.of(\"user\", \"job\", \"age\", \"credit_score\"))\n", + " .numResults(5)\n", + " .build();\n", + "\n", + "List> hybridResults = index.query(hybridQuery);\n", + "System.out.println(\"HybridQuery results (text='engineer', default RRF combination):\");\n", + "resultPrint(hybridResults);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### RRF vs LINEAR Combination\n", + "\n", + "**RRF (Reciprocal Rank Fusion)** is the default combination method. It merges ranked result lists from text and vector search without requiring score normalization. Controlled by `rrfWindow` and `rrfConstant`.\n", + "\n", + "**LINEAR** combination directly weights the text and vector scores. The `linearAlpha` parameter controls the text weight:\n", + "- `linearAlpha = 0.3` (default) → 30% text, 70% vector\n", + "- `linearAlpha = 0.5` → 50/50 balanced\n", + "- `linearAlpha = 0.7` → 70% text, 30% vector\n", + "\n", + "> **Note:** In `HybridQuery`, `linearAlpha` is the **text** weight. This is the opposite of `AggregateHybridQuery.alpha`, which is the **vector** weight." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HybridQuery results (text='doctor', LINEAR with alpha=0.5):\n", + "┌────────────┬───────────────┬─────────────┬──────────────┬─────────────┬─────────────┬───────┬─────────────────┬───┐\n", + "│credit_score│vector_distance│text_score │hybrid_score │job │__score │user │vector_similarity│age│\n", + "├────────────┼───────────────┼─────────────┼──────────────┼─────────────┼─────────────┼───────┼─────────────────┼───┤\n", + "│low │0 │1.16315082471│1.08157541235 │doctor │1.16315082471│derrick│1 │14 │\n", + "│high │0 │0 │0.5 │engineer │0 │john │1 │18 │\n", + "│high │0.109129190445 │0 │0.472717702389│engineer │0 │tyler │0.945435404778 │100│\n", + "│high │0.158808887005 │0 │0.460297778249│dermatologist│0 │tim │0.920595556498 │12 │\n", + "│low │0.217881977558 │0 │0.44552950561 │CEO │0 │taimur │0.891059011221 │15 │\n", + "└────────────┴───────────────┴─────────────┴──────────────┴─────────────┴─────────────┴───────┴─────────────────┴───┘\n" + ] + } + ], + "source": [ + "// HybridQuery with LINEAR combination and custom alpha\n", + "HybridQuery linearQuery = HybridQuery.builder()\n", + " .text(\"doctor\")\n", + " .textFieldName(\"job\")\n", + " .vector(new float[]{0.1f, 0.1f, 0.5f})\n", + " .vectorFieldName(\"user_embedding\")\n", + " .combinationMethod(HybridQuery.CombinationMethod.LINEAR)\n", + " .linearAlpha(0.5f) // 50% text weight, 50% vector weight\n", + " .returnFields(List.of(\"user\", \"job\", \"age\", \"credit_score\"))\n", + " .numResults(5)\n", + " .build();\n", + "\n", + "List> linearResults = index.query(linearQuery);\n", + "System.out.println(\"HybridQuery results (text='doctor', LINEAR with alpha=0.5):\");\n", + "resultPrint(linearResults);" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HybridQuery with filter (text='engineer', credit_score=high):\n", + "┌────────────┬───────────────┬──────────────┬──────────────┬─────────────┬──────────────┬─────┬─────────────────┬───┐\n", + "│credit_score│vector_distance│text_score │hybrid_score │job │__score │user │vector_similarity│age│\n", + "├────────────┼───────────────┼──────────────┼──────────────┼─────────────┼──────────────┼─────┼─────────────────┼───┤\n", + "│high │0 │2.90166580177 │1.57049974053 │engineer │2.90166580177 │john │1 │18 │\n", + "│high │0.109129190445 │2.90166580177 │1.53230452387 │engineer │2.90166580177 │tyler│0.945435404778 │100│\n", + "│high │0.158808887005 │0.575364152354│0.817026135255│dermatologist│0.575364152354│tim │0.920595556498 │12 │\n", + "│high │0.266666650772 │0.575364152354│0.779275917936│doctor │0.575364152354│nancy│0.866666674614 │94 │\n", + "└────────────┴───────────────┴──────────────┴──────────────┴─────────────┴──────────────┴─────┴─────────────────┴───┘\n" + ] + } + ], + "source": [ + "// HybridQuery with filter expression\n", + "// Combine hybrid text+vector search with metadata filtering\n", + "HybridQuery filteredHybrid = HybridQuery.builder()\n", + " .text(\"engineer\")\n", + " .textFieldName(\"job\")\n", + " .vector(new float[]{0.1f, 0.1f, 0.5f})\n", + " .vectorFieldName(\"user_embedding\")\n", + " .filterExpression(Filter.tag(\"credit_score\", \"high\"))\n", + " .returnFields(List.of(\"user\", \"job\", \"age\", \"credit_score\"))\n", + " .numResults(5)\n", + " .build();\n", + "\n", + "List> filteredHybridResults = index.query(filteredHybrid);\n", + "System.out.println(\"HybridQuery with filter (text='engineer', credit_score=high):\");\n", + "resultPrint(filteredHybridResults);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### AggregateHybridQuery (FT.AGGREGATE)\n", + "\n", + "`AggregateHybridQuery` uses the `FT.AGGREGATE` command and works with **Redis 7.4+**. It computes a weighted linear combination of BM25 text scores and vector similarity scores:\n", + "\n", + "```\n", + "hybrid_score = (1 - alpha) * text_score + alpha * vector_similarity\n", + "```\n", + "\n", + "Where `alpha` is the **vector weight** (default 0.7 = 70% vector, 30% text).\n", + "\n", + "Use `AggregateHybridQuery` when:\n", + "- Your Redis version is 7.4–8.3 (before `FT.HYBRID` was available)\n", + "- You need explicit control over the aggregation pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AggregateHybridQuery results (text='doctor', alpha=0.7):\n", + "┌────────────┬───────────────┬─────────────┬──────────────┬─────────────┬─────────────┬───────┬─────────────────┬───┐\n", + "│credit_score│vector_distance│text_score │hybrid_score │job │__score │user │vector_similarity│age│\n", + "├────────────┼───────────────┼─────────────┼──────────────┼─────────────┼─────────────┼───────┼─────────────────┼───┤\n", + "│low │0 │1.16315082471│1.04894524741 │doctor │1.16315082471│derrick│1 │14 │\n", + "│high │0 │0 │0.7 │engineer │0 │john │1 │18 │\n", + "│high │0.109129190445 │0 │0.661804783344│engineer │0 │tyler │0.945435404778 │100│\n", + "│high │0.158808887005 │0 │0.644416889548│dermatologist│0 │tim │0.920595556498 │12 │\n", + "│low │0.217881977558 │0 │0.623741307855│CEO │0 │taimur │0.891059011221 │15 │\n", + "└────────────┴───────────────┴─────────────┴──────────────┴─────────────┴─────────────┴───────┴─────────────────┴───┘\n" + ] + } + ], + "source": [ + "// AggregateHybridQuery example\n", + "AggregateHybridQuery aggQuery = AggregateHybridQuery.builder()\n", + " .text(\"doctor\")\n", + " .textFieldName(\"job\")\n", + " .vector(new float[]{0.1f, 0.1f, 0.5f})\n", + " .vectorFieldName(\"user_embedding\")\n", + " .alpha(0.7f) // 70% vector weight, 30% text weight\n", + " .returnFields(List.of(\"user\", \"job\", \"age\", \"credit_score\"))\n", + " .numResults(5)\n", + " .build();\n", + "\n", + "List> aggResults = index.query(aggQuery);\n", + "System.out.println(\"AggregateHybridQuery results (text='doctor', alpha=0.7):\");\n", + "resultPrint(aggResults);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### HybridQuery vs AggregateHybridQuery\n", + "\n", + "| Feature | HybridQuery | AggregateHybridQuery |\n", + "|---|---|---|\n", + "| Redis command | `FT.HYBRID` | `FT.AGGREGATE` |\n", + "| Min Redis version | 8.4+ | 7.4+ |\n", + "| Combination methods | RRF (default), LINEAR | Weighted linear only |\n", + "| Alpha semantics | `linearAlpha` = text weight (default 0.3) | `alpha` = vector weight (default 0.7) |\n", + "| Score aliases | Yes (`yieldTextScoreAs`, etc.) | No |\n", + "| Fallback | Auto-falls back to AggregateHybridQuery | N/A |\n", + "\n", + "**Recommendation:** Use `HybridQuery` when possible — it automatically falls back to `AggregateHybridQuery` on older Redis versions via `toAggregateHybridQuery()`." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1346,7 +1592,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 33, "metadata": { "vscode": { "languageId": "java" @@ -1387,8 +1633,9 @@ "5. **Filter Combinations**: AND/OR logic for complex queries\n", "6. **Pure Filter Queries**: Traditional database-style queries without vector similarity\n", "7. **Raw Query Strings**: Direct Redis query execution\n", + "8. **Hybrid Search**: True text + vector scoring with `HybridQuery` (FT.HYBRID, Redis 8.4+) and `AggregateHybridQuery` (FT.AGGREGATE, Redis 7.4+)\n", "\n", - "These hybrid query capabilities make RedisVL a powerful tool for building sophisticated search applications that combine traditional database operations with vector similarity search." + "These query capabilities make RedisVL a powerful tool for building sophisticated search applications that combine traditional database operations with vector similarity search and hybrid text+vector scoring." ] } ], diff --git a/notebooks/11_advanced_queries.ipynb b/notebooks/11_advanced_queries.ipynb index 8975077..9a4644a 100644 --- a/notebooks/11_advanced_queries.ipynb +++ b/notebooks/11_advanced_queries.ipynb @@ -244,11 +244,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "load-data", "metadata": {}, - "outputs": [], - "source": "// Connect to Redis\nUnifiedJedis client = new UnifiedJedis(new HostAndPort(\"redis\", 6379));\n\n// Create the search index\nSearchIndex index = new SearchIndex(schema, client);\nindex.create(true);\n\n// Load data\nList keys = new ArrayList<>();\nfor (Map product : data) {\n String key = \"products:\" + product.get(\"product_id\");\n keys.add(key);\n Map fields = new HashMap<>();\n product.forEach((k, v) -> {\n if (v instanceof byte[]) {\n fields.put(k, new String((byte[]) v, java.nio.charset.StandardCharsets.ISO_8859_1));\n } else {\n fields.put(k, String.valueOf(v));\n }\n });\n client.hset(key, fields);\n}\n\nSystem.out.println(\"Loaded \" + keys.size() + \" products into the index\");" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded 6 products into the index\n" + ] + } + ], + "source": [ + "// Connect to Redis\n", + "UnifiedJedis client = new UnifiedJedis(new HostAndPort(\"redis\", 6379));\n", + "\n", + "// Create the search index\n", + "SearchIndex index = new SearchIndex(schema, client);\n", + "index.create(true);\n", + "\n", + "// Load data\n", + "List keys = new ArrayList<>();\n", + "for (Map product : data) {\n", + " String key = \"products:\" + product.get(\"product_id\");\n", + " keys.add(key);\n", + " Map fields = new HashMap<>();\n", + " product.forEach((k, v) -> {\n", + " if (v instanceof byte[]) {\n", + " fields.put(k, new String((byte[]) v, java.nio.charset.StandardCharsets.ISO_8859_1));\n", + " } else {\n", + " fields.put(k, String.valueOf(v));\n", + " }\n", + " });\n", + " client.hset(key, fields);\n", + "}\n", + "\n", + "System.out.println(\"Loaded \" + keys.size() + \" products into the index\");" + ] }, { "cell_type": "markdown", @@ -266,11 +299,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "text-query-basic", "metadata": {}, - "outputs": [], - "source": "TextQuery textQuery = TextQuery.builder()\n .text(\"running shoes\")\n .textField(\"brief_description\")\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"category\", \"price\"))\n .numResults(5)\n .build();\n\nList> results = index.query(textQuery);\n\nSystem.out.println(\"Found \" + results.size() + \" results:\");\nfor (Map result : results) {\n System.out.println(\" \" + result.get(\"product_id\") + \": \" + result.get(\"brief_description\"));\n}" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 0 results:\n" + ] + } + ], + "source": [ + "TextQuery textQuery = TextQuery.builder()\n", + " .text(\"running shoes\")\n", + " .textField(\"brief_description\")\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"category\", \"price\"))\n", + " .numResults(5)\n", + " .build();\n", + "\n", + "List> results = index.query(textQuery);\n", + "\n", + "System.out.println(\"Found \" + results.size() + \" results:\");\n", + "for (Map result : results) {\n", + " System.out.println(\" \" + result.get(\"product_id\") + \": \" + result.get(\"brief_description\"));\n", + "}" + ] }, { "cell_type": "markdown", @@ -284,19 +339,65 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "text-query-bm25", "metadata": {}, - "outputs": [], - "source": "// BM25 standard scoring (default)\nTextQuery bm25Query = TextQuery.builder()\n .text(\"comfortable shoes\")\n .textField(\"brief_description\")\n .scorer(\"BM25STD\")\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"price\"))\n .numResults(3)\n .build();\n\nSystem.out.println(\"Results with BM25 scoring:\");\nList> bm25Results = index.query(bm25Query);\nfor (Map result : bm25Results) {\n System.out.println(\" \" + result.get(\"product_id\") + \": \" + result.get(\"brief_description\"));\n}" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Results with BM25 scoring:\n" + ] + } + ], + "source": [ + "// BM25 standard scoring (default)\n", + "TextQuery bm25Query = TextQuery.builder()\n", + " .text(\"comfortable shoes\")\n", + " .textField(\"brief_description\")\n", + " .scorer(\"BM25STD\")\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"price\"))\n", + " .numResults(3)\n", + " .build();\n", + "\n", + "System.out.println(\"Results with BM25 scoring:\");\n", + "List> bm25Results = index.query(bm25Query);\n", + "for (Map result : bm25Results) {\n", + " System.out.println(\" \" + result.get(\"product_id\") + \": \" + result.get(\"brief_description\"));\n", + "}" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "text-query-tfidf", "metadata": {}, - "outputs": [], - "source": "// TFIDF scoring\nTextQuery tfidfQuery = TextQuery.builder()\n .text(\"comfortable shoes\")\n .textField(\"brief_description\")\n .scorer(\"TFIDF\")\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"price\"))\n .numResults(3)\n .build();\n\nSystem.out.println(\"Results with TFIDF scoring:\");\nList> tfidfResults = index.query(tfidfQuery);\nfor (Map result : tfidfResults) {\n System.out.println(\" \" + result.get(\"product_id\") + \": \" + result.get(\"brief_description\"));\n}" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Results with TFIDF scoring:\n" + ] + } + ], + "source": [ + "// TFIDF scoring\n", + "TextQuery tfidfQuery = TextQuery.builder()\n", + " .text(\"comfortable shoes\")\n", + " .textField(\"brief_description\")\n", + " .scorer(\"TFIDF\")\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"price\"))\n", + " .numResults(3)\n", + " .build();\n", + "\n", + "System.out.println(\"Results with TFIDF scoring:\");\n", + "List> tfidfResults = index.query(tfidfQuery);\n", + "for (Map result : tfidfResults) {\n", + " System.out.println(\" \" + result.get(\"product_id\") + \": \" + result.get(\"brief_description\"));\n", + "}" + ] }, { "cell_type": "markdown", @@ -310,19 +411,65 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "text-query-filter-tag", "metadata": {}, - "outputs": [], - "source": "// Search for \"shoes\" only in the footwear category\nTextQuery filteredTextQuery = TextQuery.builder()\n .text(\"shoes\")\n .textField(\"brief_description\")\n .filterExpression(Filter.tag(\"category\", \"footwear\"))\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"category\", \"price\"))\n .numResults(5)\n .build();\n\nList> filteredResults = index.query(filteredTextQuery);\nSystem.out.println(\"Filtered results (footwear category):\");\nfor (Map result : filteredResults) {\n System.out.println(\" \" + result.get(\"brief_description\"));\n}" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filtered results (footwear category):\n" + ] + } + ], + "source": [ + "// Search for \"shoes\" only in the footwear category\n", + "TextQuery filteredTextQuery = TextQuery.builder()\n", + " .text(\"shoes\")\n", + " .textField(\"brief_description\")\n", + " .filterExpression(Filter.tag(\"category\", \"footwear\"))\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"category\", \"price\"))\n", + " .numResults(5)\n", + " .build();\n", + "\n", + "List> filteredResults = index.query(filteredTextQuery);\n", + "System.out.println(\"Filtered results (footwear category):\");\n", + "for (Map result : filteredResults) {\n", + " System.out.println(\" \" + result.get(\"brief_description\"));\n", + "}" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "text-query-filter-numeric", "metadata": {}, - "outputs": [], - "source": "// Search for products under $100\nTextQuery priceFilteredQuery = TextQuery.builder()\n .text(\"comfortable\")\n .textField(\"brief_description\")\n .filterExpression(Filter.numeric(\"price\").lt(100))\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"price\"))\n .numResults(5)\n .build();\n\nList> priceResults = index.query(priceFilteredQuery);\nSystem.out.println(\"Price filtered results (under $100):\");\nfor (Map result : priceResults) {\n System.out.println(\" \" + result.get(\"brief_description\") + \" - $\" + result.get(\"price\"));\n}" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Price filtered results (under $100):\n" + ] + } + ], + "source": [ + "// Search for products under $100\n", + "TextQuery priceFilteredQuery = TextQuery.builder()\n", + " .text(\"comfortable\")\n", + " .textField(\"brief_description\")\n", + " .filterExpression(Filter.numeric(\"price\").lt(100))\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\", \"price\"))\n", + " .numResults(5)\n", + " .build();\n", + "\n", + "List> priceResults = index.query(priceFilteredQuery);\n", + "System.out.println(\"Price filtered results (under $100):\");\n", + "for (Map result : priceResults) {\n", + " System.out.println(\" \" + result.get(\"brief_description\") + \" - $\" + result.get(\"price\"));\n", + "}" + ] }, { "cell_type": "markdown", @@ -337,11 +484,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "text-query-weighted", "metadata": {}, - "outputs": [], - "source": "Map fieldWeights = new HashMap<>();\nfieldWeights.put(\"brief_description\", 1.0);\nfieldWeights.put(\"full_description\", 0.5);\n\nTextQuery weightedQuery = TextQuery.builder()\n .text(\"shoes\")\n .textFieldWeights(fieldWeights)\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n .numResults(3)\n .build();\n\nList> weightedResults = index.query(weightedQuery);\nSystem.out.println(\"Weighted field search results:\");\nfor (Map result : weightedResults) {\n System.out.println(\" \" + result.get(\"brief_description\"));\n}" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Weighted field search results:\n" + ] + } + ], + "source": [ + "Map fieldWeights = new HashMap<>();\n", + "fieldWeights.put(\"brief_description\", 1.0);\n", + "fieldWeights.put(\"full_description\", 0.5);\n", + "\n", + "TextQuery weightedQuery = TextQuery.builder()\n", + " .text(\"shoes\")\n", + " .textFieldWeights(fieldWeights)\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n", + " .numResults(3)\n", + " .build();\n", + "\n", + "List> weightedResults = index.query(weightedQuery);\n", + "System.out.println(\"Weighted field search results:\");\n", + "for (Map result : weightedResults) {\n", + " System.out.println(\" \" + result.get(\"brief_description\"));\n", + "}" + ] }, { "cell_type": "markdown", @@ -376,14 +548,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to execute hybrid query: Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mjava.lang.RuntimeException: Failed to execute hybrid query: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1537)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#48:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "HybridQuery results (native FT.HYBRID):\n" ] } ], @@ -425,33 +593,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mredis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:68)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:94)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.connect(Connection.java:269)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:507)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:499)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection$Builder.build(Connection.java:60)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.build(ConnectionFactory.java:154)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.lambda$initAuthXManager$0(ConnectionFactory.java:144)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:177)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:557)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:299)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:231)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.util.Pool.getResource(Pool.java:38)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:55)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:13)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:317)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.ftAggregate(UnifiedJedis.java:4547)\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1552)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#50:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "AggregateHybridQuery results (FT.AGGREGATE):\n" ] } ], @@ -507,17 +652,6 @@ "text": [ "Results with linearAlpha=0.1 (vector-heavy):\n" ] - }, - { - "ename": "EvalException", - "evalue": "Failed to execute hybrid query: Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mjava.lang.RuntimeException: Failed to execute hybrid query: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1537)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#53:1)\u001b[0m" - ] } ], "source": [ @@ -555,36 +689,6 @@ "text": [ "Results with alpha=0.9 (vector-heavy):\n" ] - }, - { - "ename": "EvalException", - "evalue": "Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mredis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:68)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:94)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.connect(Connection.java:269)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:507)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:499)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection$Builder.build(Connection.java:60)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.build(ConnectionFactory.java:154)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.lambda$initAuthXManager$0(ConnectionFactory.java:144)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:177)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:557)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:299)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:231)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.util.Pool.getResource(Pool.java:38)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:55)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:13)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:317)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.ftAggregate(UnifiedJedis.java:4547)\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1552)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#56:1)\u001b[0m" - ] } ], "source": [ @@ -629,14 +733,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to execute hybrid query: Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mjava.lang.RuntimeException: Failed to execute hybrid query: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1537)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#58:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "Results with RRF combination:\n" ] } ], @@ -679,14 +779,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to execute hybrid query: Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mjava.lang.RuntimeException: Failed to execute hybrid query: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1537)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#60:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "HybridQuery filtered results (price > $100):\n" ] } ], @@ -720,33 +816,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mredis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:68)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:94)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.connect(Connection.java:269)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:507)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:499)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection$Builder.build(Connection.java:60)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.build(ConnectionFactory.java:154)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.lambda$initAuthXManager$0(ConnectionFactory.java:144)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:177)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:557)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:299)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:231)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.util.Pool.getResource(Pool.java:38)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:55)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:13)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:317)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.ftAggregate(UnifiedJedis.java:4547)\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1552)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#62:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "AggregateHybridQuery filtered results (price > $100):\n" ] } ], @@ -786,14 +859,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to execute hybrid query: Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mjava.lang.RuntimeException: Failed to execute hybrid query: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1537)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#64:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "HybridQuery with TFIDF scorer:\n" ] } ], @@ -827,33 +896,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mredis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:68)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:94)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.connect(Connection.java:269)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:507)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:499)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection$Builder.build(Connection.java:60)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.build(ConnectionFactory.java:154)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.lambda$initAuthXManager$0(ConnectionFactory.java:144)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:177)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:557)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:299)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:231)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.util.Pool.getResource(Pool.java:38)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:55)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:13)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:317)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.ftAggregate(UnifiedJedis.java:4547)\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1552)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#66:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "AggregateHybridQuery with TFIDF scorer:\n" ] } ], @@ -928,33 +974,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mredis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:68)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:94)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.connect(Connection.java:269)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:507)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:499)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection$Builder.build(Connection.java:60)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.build(ConnectionFactory.java:154)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.lambda$initAuthXManager$0(ConnectionFactory.java:144)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:177)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:557)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:299)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:231)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.util.Pool.getResource(Pool.java:38)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:55)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:13)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:317)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.ftAggregate(UnifiedJedis.java:4547)\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1552)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#70:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-vector search results:\n" ] } ], @@ -1010,36 +1033,6 @@ "text": [ "Results with emphasis on image similarity:\n" ] - }, - { - "ename": "EvalException", - "evalue": "Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mredis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:68)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:94)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.connect(Connection.java:269)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:507)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:499)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection$Builder.build(Connection.java:60)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.build(ConnectionFactory.java:154)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.lambda$initAuthXManager$0(ConnectionFactory.java:144)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:177)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:557)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:299)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:231)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.util.Pool.getResource(Pool.java:38)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:55)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:13)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:317)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.ftAggregate(UnifiedJedis.java:4547)\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1552)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#75:1)\u001b[0m" - ] } ], "source": [ @@ -1088,33 +1081,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Failed to connect to localhost:6379.", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mredis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to localhost:6379.\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:68)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:94)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.connect(Connection.java:269)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:507)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:499)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.Connection$Builder.build(Connection.java:60)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.build(ConnectionFactory.java:154)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.lambda$initAuthXManager$0(ConnectionFactory.java:144)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:177)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:557)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:299)\u001b[0m", - "\u001b[1m\u001b[31m\tat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:231)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.util.Pool.getResource(Pool.java:38)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:55)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:13)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:317)\u001b[0m", - "\u001b[1m\u001b[31m\tat redis.clients.jedis.UnifiedJedis.ftAggregate(UnifiedJedis.java:4547)\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.query(SearchIndex.java:1552)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#79:1)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "Filtered multi-vector results (footwear only):\n" ] } ], @@ -1160,11 +1130,86 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "compare-queries", "metadata": {}, - "outputs": [], - "source": "// TextQuery - keyword-based search\nTextQuery textQ = TextQuery.builder()\n .text(\"shoes\")\n .textField(\"brief_description\")\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n .numResults(3)\n .build();\n\nSystem.out.println(\"TextQuery Results (keyword-based):\");\nList> textResults = index.query(textQ);\nfor (Map result : textResults) {\n System.out.println(\" \" + result.get(\"brief_description\"));\n}\nSystem.out.println();\n\n// HybridQuery - combines text and vector search (native FT.HYBRID)\nHybridQuery hybridQ = HybridQuery.builder()\n .text(\"shoes\")\n .textFieldName(\"brief_description\")\n .vector(new float[]{0.1f, 0.2f, 0.1f})\n .vectorFieldName(\"text_embedding\")\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n .numResults(3)\n .combinationMethod(HybridQuery.CombinationMethod.LINEAR)\n .yieldTextScoreAs(\"text_score\")\n .yieldVsimScoreAs(\"vector_similarity\")\n .yieldCombinedScoreAs(\"hybrid_score\")\n .build();\n\nSystem.out.println(\"HybridQuery Results (text + vector):\");\nList> hybridQResults = index.query(hybridQ);\nfor (Map result : hybridQResults) {\n System.out.println(\" \" + result.get(\"brief_description\"));\n}\nSystem.out.println();\n\n// MultiVectorQuery - searches multiple vector fields\ncom.redis.vl.query.Vector mvText = com.redis.vl.query.Vector.builder()\n .vector(new float[]{0.1f, 0.2f, 0.1f})\n .fieldName(\"text_embedding\")\n .dtype(\"float32\")\n .weight(0.7)\n .build();\n\ncom.redis.vl.query.Vector mvImage = com.redis.vl.query.Vector.builder()\n .vector(new float[]{0.8f, 0.1f})\n .fieldName(\"image_embedding\")\n .dtype(\"float32\")\n .weight(0.3)\n .build();\n\nMultiVectorQuery multiQ = MultiVectorQuery.builder()\n .vectors(mvText, mvImage)\n .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n .numResults(3)\n .build();\n\nSystem.out.println(\"MultiVectorQuery Results (multiple vectors):\");\nList> mvResults = index.query(multiQ);\nfor (Map result : mvResults) {\n System.out.println(\" \" + result.get(\"brief_description\"));\n}" + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TextQuery Results (keyword-based):\n", + "\n", + "HybridQuery Results (text + vector):\n", + "\n", + "MultiVectorQuery Results (multiple vectors):\n" + ] + } + ], + "source": [ + "// TextQuery - keyword-based search\n", + "TextQuery textQ = TextQuery.builder()\n", + " .text(\"shoes\")\n", + " .textField(\"brief_description\")\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n", + " .numResults(3)\n", + " .build();\n", + "\n", + "System.out.println(\"TextQuery Results (keyword-based):\");\n", + "List> textResults = index.query(textQ);\n", + "for (Map result : textResults) {\n", + " System.out.println(\" \" + result.get(\"brief_description\"));\n", + "}\n", + "System.out.println();\n", + "\n", + "// HybridQuery - combines text and vector search (native FT.HYBRID)\n", + "HybridQuery hybridQ = HybridQuery.builder()\n", + " .text(\"shoes\")\n", + " .textFieldName(\"brief_description\")\n", + " .vector(new float[]{0.1f, 0.2f, 0.1f})\n", + " .vectorFieldName(\"text_embedding\")\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n", + " .numResults(3)\n", + " .combinationMethod(HybridQuery.CombinationMethod.LINEAR)\n", + " .yieldTextScoreAs(\"text_score\")\n", + " .yieldVsimScoreAs(\"vector_similarity\")\n", + " .yieldCombinedScoreAs(\"hybrid_score\")\n", + " .build();\n", + "\n", + "System.out.println(\"HybridQuery Results (text + vector):\");\n", + "List> hybridQResults = index.query(hybridQ);\n", + "for (Map result : hybridQResults) {\n", + " System.out.println(\" \" + result.get(\"brief_description\"));\n", + "}\n", + "System.out.println();\n", + "\n", + "// MultiVectorQuery - searches multiple vector fields\n", + "com.redis.vl.query.Vector mvText = com.redis.vl.query.Vector.builder()\n", + " .vector(new float[]{0.1f, 0.2f, 0.1f})\n", + " .fieldName(\"text_embedding\")\n", + " .dtype(\"float32\")\n", + " .weight(0.7)\n", + " .build();\n", + "\n", + "com.redis.vl.query.Vector mvImage = com.redis.vl.query.Vector.builder()\n", + " .vector(new float[]{0.8f, 0.1f})\n", + " .fieldName(\"image_embedding\")\n", + " .dtype(\"float32\")\n", + " .weight(0.3)\n", + " .build();\n", + "\n", + "MultiVectorQuery multiQ = MultiVectorQuery.builder()\n", + " .vectors(mvText, mvImage)\n", + " .returnFields(Arrays.asList(\"product_id\", \"brief_description\"))\n", + " .numResults(3)\n", + " .build();\n", + "\n", + "System.out.println(\"MultiVectorQuery Results (multiple vectors):\");\n", + "List> mvResults = index.query(multiQ);\n", + "for (Map result : mvResults) {\n", + " System.out.println(\" \" + result.get(\"brief_description\"));\n", + "}" + ] }, { "cell_type": "markdown", @@ -1216,14 +1261,10 @@ "metadata": {}, "outputs": [ { - "ename": "EvalException", - "evalue": "Index advanced_queries does not exist", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1m\u001b[31mcom.redis.vl.exceptions.RedisVLException: Index advanced_queries does not exist\u001b[0m", - "\u001b[1m\u001b[31m\tat com.redis.vl.index.SearchIndex.delete(SearchIndex.java:971)\u001b[0m", - "\u001b[1m\u001b[31m\tat .(#81:2)\u001b[0m" + "name": "stdout", + "output_type": "stream", + "text": [ + "Cleanup complete\n" ] } ], @@ -1255,4 +1296,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +}