diff --git a/Examples/ConvertSearchResultToJson.md b/Examples/ConvertSearchResultToJson.md new file mode 100644 index 00000000..2d060e39 --- /dev/null +++ b/Examples/ConvertSearchResultToJson.md @@ -0,0 +1,31 @@ +# Converting Search Result to JSON +## This example shows how to convert Redis search results to JSON format using NRedisStack. + +Connect to the Redis server: +```csharp +var redis = ConnectionMultiplexer.Connect("localhost"); +``` +Get a reference to the database and for search and json commands: +```csharp +var db = redis.GetDatabase(); +var ft = db.FT(); +var json = db.JSON(); +``` +Create a search index with a JSON field: +```csharp +ft.Create("test", new FTCreateParams().On(IndexDataType.JSON).Prefix("doc:"), + new Schema().AddTagField(new FieldName("$.name", "name"))); +``` +Insert 10 JSON documents into the index: +```csharp +for (int i = 0; i < 10; i++) +{ + json.Set("doc:" + i, "$", "{\"name\":\"foo\"}"); +} +``` +Execute a search query and convert the results to JSON: +```csharp +var res = ft.Search("test", new Query("@name:{foo}")); +var docs = res.ToJson(); +``` +Now the `docs` variable contains a JSON list (IEnumerable) of the search results. \ No newline at end of file diff --git a/src/NRedisStack/Search/SearchResult.cs b/src/NRedisStack/Search/SearchResult.cs index 4232c5c0..76a76cfb 100644 --- a/src/NRedisStack/Search/SearchResult.cs +++ b/src/NRedisStack/Search/SearchResult.cs @@ -12,6 +12,12 @@ public class SearchResult public long TotalResults { get; } public List Documents { get; } + /// + /// Converts the documents to a list of json strings. only works on a json documents index. + /// + public IEnumerable? ToJson() => Documents.Select(x => x["json"].ToString()) + .Where(x => !string.IsNullOrEmpty(x)); + internal SearchResult(RedisResult[] resp, bool hasContent, bool hasScores, bool hasPayloads/*, bool shouldExplainScore*/) { // Calculate the step distance to walk over the results. diff --git a/tests/NRedisStack.Tests/Examples/ExamplesTests.cs b/tests/NRedisStack.Tests/Examples/ExamplesTests.cs index 7af5530d..5ee2b46a 100644 --- a/tests/NRedisStack.Tests/Examples/ExamplesTests.cs +++ b/tests/NRedisStack.Tests/Examples/ExamplesTests.cs @@ -61,6 +61,10 @@ public void HSETandSearch() // Search for hashes with last name of Rod var lastNameRod = ft.Search("example_index", new Query("@last:Rod")); // lastNameRod is empty because there are no hashes with a last name of Rod that match the index definition + Assert.Equal(4, noFilters.TotalResults); + Assert.Equal(2, startWithJo.TotalResults); + Assert.Equal(1, namedPat.TotalResults); + Assert.Equal(0, lastNameRod.TotalResults); } [Fact] @@ -226,7 +230,7 @@ public async Task TransactionExample() var tran = new Transaction(db); // Add account details with Json.Set to transaction - tran.Json.SetAsync("accdetails:Jeeva", "$", new { name = "Jeeva", totalAmount= 1000, bankName = "City" }); + tran.Json.SetAsync("accdetails:Jeeva", "$", new { name = "Jeeva", totalAmount = 1000, bankName = "City" }); tran.Json.SetAsync("accdetails:Shachar", "$", new { name = "Shachar", totalAmount = 1000, bankName = "City" }); // Get the Json response @@ -240,8 +244,8 @@ public async Task TransactionExample() tran.Json.NumIncrbyAsync("accdetails:Shachar", "$.totalAmount", 200); // Get total amount for both Jeeva = 800 & Shachar = 1200 - var totalAmtOfJeeva = tran.Json.GetAsync("accdetails:Jeeva", path:"$.totalAmount"); - var totalAmtOfShachar = tran.Json.GetAsync("accdetails:Shachar", path:"$.totalAmount"); + var totalAmtOfJeeva = tran.Json.GetAsync("accdetails:Jeeva", path: "$.totalAmount"); + var totalAmtOfShachar = tran.Json.GetAsync("accdetails:Shachar", path: "$.totalAmount"); // Execute the transaction var condition = tran.ExecuteAsync(); @@ -253,4 +257,26 @@ public async Task TransactionExample() Assert.Equal("[800]", totalAmtOfJeeva.Result.ToString()); Assert.Equal("[1200]", totalAmtOfShachar.Result.ToString()); } + + [Fact] + public void TestJsonConvert() + { + ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); + IDatabase db = redis.GetDatabase(); + db.Execute("FLUSHALL"); + ISearchCommands ft = db.FT(); + IJsonCommands json = db.JSON(); + + ft.Create("test", new FTCreateParams().On(IndexDataType.JSON).Prefix("doc:"), + new Schema().AddTagField(new FieldName("$.name", "name"))); + for (int i = 0; i < 10; i++) + { + json.Set("doc:" + i, "$", "{\"name\":\"foo\"}"); + } + var res = ft.Search("test", new Query("@name:{foo}")); + + var docs = res.ToJson(); + + Assert.Equal(10, docs.Count()); + } } \ No newline at end of file