Skip to content

Commit 049ecb5

Browse files
authored
Initial Hybrid Search (FT.HYBRID) bindings (#454)
* in-progress hybrid search * preliminary API and final unit tests (no integration tests yet) * push docs * start integration tests * tweaking API * refactor API and deal with missing server features * mask cursor API, unclear * normalize API * rev local docker and mark docs as non-packable * dotnet format * better support for vector data * dotnet format * naming is hard * implement NOSORT * move parameters back to to method, not the builder * push all the changes * more working-esque integration tests * parse search results correctly * integration tests * pre-vs-post-filter * attr * update client docker * fix HC unit tests * updating 8.4 state * format and fixups * VectorData; make API usable * ensure integration tests use the VectorData API * force VSIM payloads as vectors, unless named * dotnet format * clarify 8.4 * add a word * Support window on linear combiner * thread safety notes on HybridSearchQuery.cs * dotnet format
1 parent 1ca7020 commit 049ecb5

31 files changed

+3197
-38
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
2424
<SuppressTfmSupportBuildErrors>true</SuppressTfmSupportBuildErrors>
2525
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
26-
<NoWarn>$(NoWarn);CS1591</NoWarn>
26+
<NoWarn>$(NoWarn);CS1591;NRS001</NoWarn>
2727
<IsWindows>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_Windows())))</IsWindows>
2828
</PropertyGroup>
2929

NRedisStack.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{84D6210F
1515
Directory.Packages.props = Directory.Packages.props
1616
global.json = global.json
1717
version.json = version.json
18+
tests\dockers\docker-compose.yml = tests\dockers\docker-compose.yml
1819
EndProjectSection
1920
EndProject
21+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "docs", "docs\docs.csproj", "{4A35FC3C-69BC-4BDB-A4B2-6BFD0DF215AD}"
22+
EndProject
2023
Global
2124
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2225
Debug|Any CPU = Debug|Any CPU
@@ -38,5 +41,9 @@ Global
3841
{F14F6342-14A0-4DDD-AB05-C425B1AD8001}.Debug|Any CPU.Build.0 = Debug|Any CPU
3942
{F14F6342-14A0-4DDD-AB05-C425B1AD8001}.Release|Any CPU.ActiveCfg = Release|Any CPU
4043
{F14F6342-14A0-4DDD-AB05-C425B1AD8001}.Release|Any CPU.Build.0 = Release|Any CPU
44+
{4A35FC3C-69BC-4BDB-A4B2-6BFD0DF215AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45+
{4A35FC3C-69BC-4BDB-A4B2-6BFD0DF215AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
46+
{4A35FC3C-69BC-4BDB-A4B2-6BFD0DF215AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
47+
{4A35FC3C-69BC-4BDB-A4B2-6BFD0DF215AD}.Release|Any CPU.Build.0 = Release|Any CPU
4148
EndGlobalSection
4249
EndGlobal

docs/docs.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<Project Sdk="Microsoft.Build.NoTargets/3.3.0">
2+
<!-- this is actually here just to serve as a hub for docs, so we don't need to keep editing the sln-->
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<IsPackable>false</IsPackable>
6+
</PropertyGroup>
7+
</Project>

docs/exp/NRS001.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
Redis 8.4 is a relatively new release (at time of writing); the features and API may be subject to change.
2+
3+
*Hybrid Search* is a new feature in Redis 8.4 that allows you to search across multiple indexes and data types.
4+
5+
The corresponding library feature must also be considered subject to change:
6+
7+
1. Existing bindings may cease working correctly if the underlying server API changes.
8+
2. Changes to the server API may require changes to the library API, manifesting in either/both of build-time
9+
or run-time breaks.
10+
11+
While this seems *unlikely*, it must be considered a possibility. If you acknowledge this, you can suppress
12+
this warning by adding the following to your `csproj` file:
13+
14+
```xml
15+
<NoWarn>$(NoWarn);NRS001</NoWarn>
16+
```
17+
18+
or more granularly / locally in C#:
19+
20+
``` c#
21+
#pragma warning disable NRS001
22+
```

src/NRedisStack/Experiments.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
namespace NRedisStack
2+
{
3+
// [Experimental(Experiments.SomeFeature, UrlFormat = Experiments.UrlFormat)]
4+
// where SomeFeature has the next label, for example "NRS042", and /docs/exp/NRS042.md exists
5+
internal static class Experiments
6+
{
7+
public const string UrlFormat = "https://redis.github.io/NRedisStack/exp/";
8+
9+
// ReSharper disable once InconsistentNaming
10+
public const string Server_8_4 = "NRS001";
11+
}
12+
}
13+
14+
#if !NET8_0_OR_GREATER
15+
#pragma warning disable SA1403
16+
namespace System.Diagnostics.CodeAnalysis
17+
#pragma warning restore SA1403
18+
{
19+
[AttributeUsage(
20+
AttributeTargets.Assembly |
21+
AttributeTargets.Module |
22+
AttributeTargets.Class |
23+
AttributeTargets.Struct |
24+
AttributeTargets.Enum |
25+
AttributeTargets.Constructor |
26+
AttributeTargets.Method |
27+
AttributeTargets.Property |
28+
AttributeTargets.Field |
29+
AttributeTargets.Event |
30+
AttributeTargets.Interface |
31+
AttributeTargets.Delegate,
32+
Inherited = false)]
33+
internal sealed class ExperimentalAttribute(string diagnosticId) : Attribute
34+
{
35+
public string DiagnosticId { get; } = diagnosticId;
36+
public string? UrlFormat { get; set; }
37+
public string? Message { get; set; }
38+
}
39+
}
40+
#endif

src/NRedisStack/NRedisStack.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
</PropertyGroup>
1616

1717
<ItemGroup>
18+
<InternalsVisibleTo Include="NRedisStack.Tests" />
1819
<PackageReference Include="StackExchange.Redis"/>
1920
<PackageReference Include="System.Text.Json" Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'net481'"/>
2021
<None Include="../../Redis.png" Link="Redis.png" Pack="true" PackagePath="/" Visible="false"/>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// ReSharper disable once CheckNamespace
2+
namespace System.Runtime.CompilerServices;
3+
4+
#if !NET9_0_OR_GREATER
5+
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
6+
internal sealed class OverloadResolutionPriorityAttribute(int priority) : Attribute
7+
{
8+
public int Priority { get; } = priority;
9+
}
10+
#endif

src/NRedisStack/PublicAPI/PublicAPI.Shipped.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,3 +1414,15 @@ static NRedisStack.Search.FieldName.implicit operator NRedisStack.Search.FieldNa
14141414
NRedisStack.DataTypes.TimeStamp.Equals(NRedisStack.DataTypes.TimeStamp other) -> bool
14151415
static NRedisStack.DataTypes.TimeStamp.operator ==(NRedisStack.DataTypes.TimeStamp left, NRedisStack.DataTypes.TimeStamp right) -> bool
14161416
static NRedisStack.DataTypes.TimeStamp.operator !=(NRedisStack.DataTypes.TimeStamp left, NRedisStack.DataTypes.TimeStamp right) -> bool
1417+
NRedisStack.ISearchCommands.AggregateEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IEnumerable<NRedisStack.Search.Aggregation.Row>!
1418+
NRedisStack.ISearchCommands.CursorDel(NRedisStack.Search.AggregationResult! result) -> bool
1419+
NRedisStack.ISearchCommands.CursorRead(NRedisStack.Search.AggregationResult! result, int? count = null) -> NRedisStack.Search.AggregationResult!
1420+
NRedisStack.ISearchCommandsAsync.AggregateAsyncEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IAsyncEnumerable<NRedisStack.Search.Aggregation.Row>!
1421+
NRedisStack.ISearchCommandsAsync.CursorDelAsync(NRedisStack.Search.AggregationResult! result) -> System.Threading.Tasks.Task<bool>!
1422+
NRedisStack.ISearchCommandsAsync.CursorReadAsync(NRedisStack.Search.AggregationResult! result, int? count = null) -> System.Threading.Tasks.Task<NRedisStack.Search.AggregationResult!>!
1423+
NRedisStack.SearchCommands.AggregateEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IEnumerable<NRedisStack.Search.Aggregation.Row>!
1424+
NRedisStack.SearchCommands.CursorDel(NRedisStack.Search.AggregationResult! result) -> bool
1425+
NRedisStack.SearchCommands.CursorRead(NRedisStack.Search.AggregationResult! result, int? count = null) -> NRedisStack.Search.AggregationResult!
1426+
NRedisStack.SearchCommandsAsync.AggregateAsyncEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IAsyncEnumerable<NRedisStack.Search.Aggregation.Row>!
1427+
NRedisStack.SearchCommandsAsync.CursorDelAsync(NRedisStack.Search.AggregationResult! result) -> System.Threading.Tasks.Task<bool>!
1428+
NRedisStack.SearchCommandsAsync.CursorReadAsync(NRedisStack.Search.AggregationResult! result, int? count = null) -> System.Threading.Tasks.Task<NRedisStack.Search.AggregationResult!>!
Lines changed: 97 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,97 @@
1-
#nullable enable
2-
NRedisStack.ISearchCommands.AggregateEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IEnumerable<NRedisStack.Search.Aggregation.Row>!
3-
NRedisStack.ISearchCommands.CursorDel(NRedisStack.Search.AggregationResult! result) -> bool
4-
NRedisStack.ISearchCommands.CursorRead(NRedisStack.Search.AggregationResult! result, int? count = null) -> NRedisStack.Search.AggregationResult!
5-
NRedisStack.ISearchCommandsAsync.AggregateAsyncEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IAsyncEnumerable<NRedisStack.Search.Aggregation.Row>!
6-
NRedisStack.ISearchCommandsAsync.CursorDelAsync(NRedisStack.Search.AggregationResult! result) -> System.Threading.Tasks.Task<bool>!
7-
NRedisStack.ISearchCommandsAsync.CursorReadAsync(NRedisStack.Search.AggregationResult! result, int? count = null) -> System.Threading.Tasks.Task<NRedisStack.Search.AggregationResult!>!
8-
NRedisStack.SearchCommands.AggregateEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IEnumerable<NRedisStack.Search.Aggregation.Row>!
9-
NRedisStack.SearchCommands.CursorDel(NRedisStack.Search.AggregationResult! result) -> bool
10-
NRedisStack.SearchCommands.CursorRead(NRedisStack.Search.AggregationResult! result, int? count = null) -> NRedisStack.Search.AggregationResult!
11-
NRedisStack.SearchCommandsAsync.AggregateAsyncEnumerable(string! index, NRedisStack.Search.AggregationRequest! query) -> System.Collections.Generic.IAsyncEnumerable<NRedisStack.Search.Aggregation.Row>!
12-
NRedisStack.SearchCommandsAsync.CursorDelAsync(NRedisStack.Search.AggregationResult! result) -> System.Threading.Tasks.Task<bool>!
13-
NRedisStack.SearchCommandsAsync.CursorReadAsync(NRedisStack.Search.AggregationResult! result, int? count = null) -> System.Threading.Tasks.Task<NRedisStack.Search.AggregationResult!>!
1+
NRedisStack.Search.Parameters
2+
static NRedisStack.Search.Parameters.From<T>(T obj) -> System.Collections.Generic.IReadOnlyDictionary<string!, object!>!
3+
[NRS001]abstract NRedisStack.Search.VectorData.AsRedisValue() -> StackExchange.Redis.RedisValue
4+
[NRS001]abstract NRedisStack.Search.VectorData<T>.Dispose() -> void
5+
[NRS001]abstract NRedisStack.Search.VectorData<T>.Span.get -> System.Span<T>
6+
[NRS001]const NRedisStack.Search.HybridSearchQuery.Fields.Key = "@__key" -> string!
7+
[NRS001]const NRedisStack.Search.HybridSearchQuery.Fields.Score = "@__score" -> string!
8+
[NRS001]NRedisStack.ISearchCommands.HybridSearch(string! indexName, NRedisStack.Search.HybridSearchQuery! query, System.Collections.Generic.IReadOnlyDictionary<string!, object!>? parameters = null) -> NRedisStack.Search.HybridSearchResult!
9+
[NRS001]NRedisStack.ISearchCommandsAsync.HybridSearchAsync(string! indexName, NRedisStack.Search.HybridSearchQuery! query, System.Collections.Generic.IReadOnlyDictionary<string!, object!>? parameters = null) -> System.Threading.Tasks.Task<NRedisStack.Search.HybridSearchResult!>!
10+
[NRS001]NRedisStack.Search.ApplyExpression
11+
[NRS001]NRedisStack.Search.ApplyExpression.Alias.get -> string?
12+
[NRS001]NRedisStack.Search.ApplyExpression.ApplyExpression() -> void
13+
[NRS001]NRedisStack.Search.ApplyExpression.ApplyExpression(string! expression, string? alias = null) -> void
14+
[NRS001]NRedisStack.Search.ApplyExpression.Expression.get -> string!
15+
[NRS001]NRedisStack.Search.HybridSearchQuery
16+
[NRS001]NRedisStack.Search.HybridSearchQuery.AllowModification() -> NRedisStack.Search.HybridSearchQuery!
17+
[NRS001]NRedisStack.Search.HybridSearchQuery.Apply(NRedisStack.Search.ApplyExpression applyExpression) -> NRedisStack.Search.HybridSearchQuery!
18+
[NRS001]NRedisStack.Search.HybridSearchQuery.Apply(params NRedisStack.Search.ApplyExpression[]! applyExpression) -> NRedisStack.Search.HybridSearchQuery!
19+
[NRS001]NRedisStack.Search.HybridSearchQuery.Combine(NRedisStack.Search.HybridSearchQuery.Combiner! combiner) -> NRedisStack.Search.HybridSearchQuery!
20+
[NRS001]NRedisStack.Search.HybridSearchQuery.Combiner
21+
[NRS001]NRedisStack.Search.HybridSearchQuery.Combiner.Combiner() -> void
22+
[NRS001]NRedisStack.Search.HybridSearchQuery.Fields
23+
[NRS001]NRedisStack.Search.HybridSearchQuery.Filter(string! expression) -> NRedisStack.Search.HybridSearchQuery!
24+
[NRS001]NRedisStack.Search.HybridSearchQuery.GroupBy(params string![]! fields) -> NRedisStack.Search.HybridSearchQuery!
25+
[NRS001]NRedisStack.Search.HybridSearchQuery.GroupBy(string! field) -> NRedisStack.Search.HybridSearchQuery!
26+
[NRS001]NRedisStack.Search.HybridSearchQuery.HybridSearchQuery() -> void
27+
[NRS001]NRedisStack.Search.HybridSearchQuery.Limit(int offset, int count) -> NRedisStack.Search.HybridSearchQuery!
28+
[NRS001]NRedisStack.Search.HybridSearchQuery.NoSort() -> NRedisStack.Search.HybridSearchQuery!
29+
[NRS001]NRedisStack.Search.HybridSearchQuery.Reduce(NRedisStack.Search.Aggregation.Reducer! reducer) -> NRedisStack.Search.HybridSearchQuery!
30+
[NRS001]NRedisStack.Search.HybridSearchQuery.Reduce(params NRedisStack.Search.Aggregation.Reducer![]! reducers) -> NRedisStack.Search.HybridSearchQuery!
31+
[NRS001]NRedisStack.Search.HybridSearchQuery.ReturnFields(params string![]! fields) -> NRedisStack.Search.HybridSearchQuery!
32+
[NRS001]NRedisStack.Search.HybridSearchQuery.ReturnFields(string! field) -> NRedisStack.Search.HybridSearchQuery!
33+
[NRS001]NRedisStack.Search.HybridSearchQuery.Search(NRedisStack.Search.HybridSearchQuery.SearchConfig query) -> NRedisStack.Search.HybridSearchQuery!
34+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig
35+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.Query.get -> string!
36+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.ScoreAlias.get -> string?
37+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.Scorer.get -> NRedisStack.Search.Scorer?
38+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.SearchConfig() -> void
39+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.SearchConfig(string! query, NRedisStack.Search.Scorer? scorer = null, string? scoreAlias = null) -> void
40+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.WithQuery(string! query) -> NRedisStack.Search.HybridSearchQuery.SearchConfig
41+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.WithScoreAlias(string? alias) -> NRedisStack.Search.HybridSearchQuery.SearchConfig
42+
[NRS001]NRedisStack.Search.HybridSearchQuery.SearchConfig.WithScorer(NRedisStack.Search.Scorer? scorer) -> NRedisStack.Search.HybridSearchQuery.SearchConfig
43+
[NRS001]NRedisStack.Search.HybridSearchQuery.SortBy(NRedisStack.Search.Aggregation.SortedField! field) -> NRedisStack.Search.HybridSearchQuery!
44+
[NRS001]NRedisStack.Search.HybridSearchQuery.SortBy(params NRedisStack.Search.Aggregation.SortedField![]! fields) -> NRedisStack.Search.HybridSearchQuery!
45+
[NRS001]NRedisStack.Search.HybridSearchQuery.SortBy(params string![]! fields) -> NRedisStack.Search.HybridSearchQuery!
46+
[NRS001]NRedisStack.Search.HybridSearchQuery.SortBy(string! field) -> NRedisStack.Search.HybridSearchQuery!
47+
[NRS001]NRedisStack.Search.HybridSearchQuery.Timeout(System.TimeSpan timeout) -> NRedisStack.Search.HybridSearchQuery!
48+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearch(NRedisStack.Search.HybridSearchQuery.VectorSearchConfig config) -> NRedisStack.Search.HybridSearchQuery!
49+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearch(string! fieldName, NRedisStack.Search.VectorData! vectorData) -> NRedisStack.Search.HybridSearchQuery!
50+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig
51+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.FieldName.get -> string!
52+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.Filter.get -> string?
53+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.Method.get -> NRedisStack.Search.VectorSearchMethod?
54+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.ScoreAlias.get -> string?
55+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.VectorData.get -> NRedisStack.Search.VectorData?
56+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.VectorSearchConfig() -> void
57+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.VectorSearchConfig(string! fieldName, NRedisStack.Search.VectorData! vectorData, NRedisStack.Search.VectorSearchMethod? method = null, string? filter = null, string? scoreAlias = null) -> void
58+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.WithFieldName(string! fieldName) -> NRedisStack.Search.HybridSearchQuery.VectorSearchConfig
59+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.WithFilter(string? filter) -> NRedisStack.Search.HybridSearchQuery.VectorSearchConfig
60+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.WithMethod(NRedisStack.Search.VectorSearchMethod? method) -> NRedisStack.Search.HybridSearchQuery.VectorSearchConfig
61+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.WithScoreAlias(string? scoreAlias) -> NRedisStack.Search.HybridSearchQuery.VectorSearchConfig
62+
[NRS001]NRedisStack.Search.HybridSearchQuery.VectorSearchConfig.WithVectorData(NRedisStack.Search.VectorData! vectorData) -> NRedisStack.Search.HybridSearchQuery.VectorSearchConfig
63+
[NRS001]NRedisStack.Search.HybridSearchResult
64+
[NRS001]NRedisStack.Search.HybridSearchResult.ExecutionTime.get -> System.TimeSpan
65+
[NRS001]NRedisStack.Search.HybridSearchResult.Results.get -> NRedisStack.Search.Document![]!
66+
[NRS001]NRedisStack.Search.HybridSearchResult.TotalResults.get -> long
67+
[NRS001]NRedisStack.Search.Scorer
68+
[NRS001]NRedisStack.Search.VectorData
69+
[NRS001]NRedisStack.Search.VectorData<T>
70+
[NRS001]NRedisStack.Search.VectorSearchMethod
71+
[NRS001]NRedisStack.SearchCommands.HybridSearch(string! indexName, NRedisStack.Search.HybridSearchQuery! query, System.Collections.Generic.IReadOnlyDictionary<string!, object!>? parameters = null) -> NRedisStack.Search.HybridSearchResult!
72+
[NRS001]NRedisStack.SearchCommandsAsync.HybridSearchAsync(string! indexName, NRedisStack.Search.HybridSearchQuery! query, System.Collections.Generic.IReadOnlyDictionary<string!, object!>? parameters = null) -> System.Threading.Tasks.Task<NRedisStack.Search.HybridSearchResult!>!
73+
[NRS001]override NRedisStack.Search.ApplyExpression.Equals(object? obj) -> bool
74+
[NRS001]override NRedisStack.Search.ApplyExpression.GetHashCode() -> int
75+
[NRS001]override NRedisStack.Search.ApplyExpression.ToString() -> string!
76+
[NRS001]override NRedisStack.Search.HybridSearchQuery.Combiner.ToString() -> string!
77+
[NRS001]override NRedisStack.Search.Scorer.ToString() -> string!
78+
[NRS001]override NRedisStack.Search.VectorData.ToString() -> string!
79+
[NRS001]override NRedisStack.Search.VectorSearchMethod.ToString() -> string!
80+
[NRS001]static NRedisStack.Search.ApplyExpression.implicit operator NRedisStack.Search.ApplyExpression(string! expression) -> NRedisStack.Search.ApplyExpression
81+
[NRS001]static NRedisStack.Search.HybridSearchQuery.Combiner.Linear(double alpha = 0.3, double beta = 0.7, int? window = null) -> NRedisStack.Search.HybridSearchQuery.Combiner!
82+
[NRS001]static NRedisStack.Search.HybridSearchQuery.Combiner.ReciprocalRankFusion(int? window = null, double? constant = null) -> NRedisStack.Search.HybridSearchQuery.Combiner!
83+
[NRS001]static NRedisStack.Search.HybridSearchQuery.SearchConfig.implicit operator NRedisStack.Search.HybridSearchQuery.SearchConfig(string! query) -> NRedisStack.Search.HybridSearchQuery.SearchConfig
84+
[NRS001]static NRedisStack.Search.Scorer.BM25Std.get -> NRedisStack.Search.Scorer!
85+
[NRS001]static NRedisStack.Search.Scorer.BM25StdNorm.get -> NRedisStack.Search.Scorer!
86+
[NRS001]static NRedisStack.Search.Scorer.DisMax.get -> NRedisStack.Search.Scorer!
87+
[NRS001]static NRedisStack.Search.Scorer.DocScore.get -> NRedisStack.Search.Scorer!
88+
[NRS001]static NRedisStack.Search.Scorer.Hamming.get -> NRedisStack.Search.Scorer!
89+
[NRS001]static NRedisStack.Search.Scorer.TfIdf.get -> NRedisStack.Search.Scorer!
90+
[NRS001]static NRedisStack.Search.Scorer.TfIdfDocNorm.get -> NRedisStack.Search.Scorer!
91+
[NRS001]static NRedisStack.Search.VectorData.implicit operator NRedisStack.Search.VectorData!(string! name) -> NRedisStack.Search.VectorData!
92+
[NRS001]static NRedisStack.Search.VectorData.Lease<T>(int dimension) -> NRedisStack.Search.VectorData<T>!
93+
[NRS001]static NRedisStack.Search.VectorData.LeaseWithValues<T>(params System.ReadOnlySpan<T> values) -> NRedisStack.Search.VectorData<T>!
94+
[NRS001]static NRedisStack.Search.VectorData.Parameter(string! name) -> NRedisStack.Search.VectorData!
95+
[NRS001]static NRedisStack.Search.VectorData.Raw(System.ReadOnlyMemory<byte> bytes) -> NRedisStack.Search.VectorData!
96+
[NRS001]static NRedisStack.Search.VectorSearchMethod.NearestNeighbour(int count = 10, int? maxCandidates = null) -> NRedisStack.Search.VectorSearchMethod!
97+
[NRS001]static NRedisStack.Search.VectorSearchMethod.Range(double radius, double? epsilon = null) -> NRedisStack.Search.VectorSearchMethod!

0 commit comments

Comments
 (0)