示例 - 索引和查询 JSON 文档
了解如何将 Redis 查询引擎与 JSON 结合使用
此示例展示了如何为 JSON 数据创建搜索索引,并针对该索引运行查询。
确保已安装 Redis 开源版和 NRedisStack
。
首先导入依赖项
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
连接到数据库
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
创建一些测试数据以添加到数据库
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
创建索引。在此示例中,仅索引键前缀为 user:
的 JSON 文档。更多信息,请参阅查询语法。
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
将这三组用户数据作为JSON 对象添加到数据库。如果您使用带 user:
前缀的键,则 Redis 会在您添加对象时自动为其建立索引。
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
您现在可以使用索引来搜索 JSON 对象。下面的查询搜索在任意字段中包含文本“Paul”且 age
值在 30 到 40 范围内的对象。
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
指定查询选项以仅返回 city
字段
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
使用聚合查询统计每个城市的所有用户数量。
using NRedisStack.RedisStackCommands;
using NRedisStack.Search;
using NRedisStack.Search.Aggregation;
using NRedisStack.Search.Literals.Enums;
using StackExchange.Redis;
public class HomeJsonExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
var user1 = new
{
name = "Paul John",
email = "[email protected]",
age = 42,
city = "London"
};
var user2 = new
{
name = "Eden Zamir",
email = "[email protected]",
age = 29,
city = "Tel Aviv"
};
var user3 = new
{
name = "Paul Zamir",
email = "[email protected]",
age = 35,
city = "Tel Aviv"
};
var schema = new Schema()
.AddTextField(new FieldName("$.name", "name"))
.AddTagField(new FieldName("$.city", "city"))
.AddNumericField(new FieldName("$.age", "age"));
bool indexCreated = db.FT().Create(
"idx:users",
new FTCreateParams()
.On(IndexDataType.JSON)
.Prefix("user:"),
schema
);
bool user1Set = db.JSON().Set("user:1", "$", user1);
bool user2Set = db.JSON().Set("user:2", "$", user2);
bool user3Set = db.JSON().Set("user:3", "$", user3);
SearchResult findPaulResult = db.FT().Search(
"idx:users",
new Query("Paul @age:[30 40]")
);
Console.WriteLine(string.Join(
", ",
findPaulResult.Documents.Select(x => x["json"])
));
// >>> {"name":"Paul Zamir","email":"[email protected]", ...
var citiesResult = db.FT().Search(
"idx:users",
new Query("Paul")
.ReturnFields(new FieldName("$.city", "city"))
);
Console.WriteLine(string.Join(
", ",
citiesResult.Documents.Select(x => x["city"]).OrderBy(x => x)
));
// >>> London, Tel Aviv
AggregationRequest aggRequest = new AggregationRequest("*")
.GroupBy("@city", Reducers.Count().As("count"));
AggregationResult aggResult = db.FT().Aggregate("idx:users", aggRequest);
IReadOnlyList<Dictionary<string, RedisValue>> resultsList =
aggResult.GetResults();
for (var i = 0; i < resultsList.Count; i++)
{
Dictionary<string, RedisValue> item = resultsList.ElementAt(i);
Console.WriteLine($"{item["city"]} - {item["count"]}");
}
// >>> London - 1
// >>> Tel Aviv - 2
var hashSchema = new Schema()
.AddTextField("name")
.AddTagField("city")
.AddNumericField("age");
bool hashIndexCreated = db.FT().Create(
"hash-idx:users",
new FTCreateParams()
.On(IndexDataType.HASH)
.Prefix("huser:"),
hashSchema
);
db.HashSet("huser:1", new HashEntry[] {
new("name", "Paul John"),
new("email", "[email protected]"),
new("age", 42),
new("city", "London")
});
db.HashSet("huser:2", new HashEntry[] {
new("name", "Eden Zamir"),
new("email", "[email protected]"),
new("age", 29),
new("city", "Tel Aviv")
});
db.HashSet("huser:3", new HashEntry[] {
new("name", "Paul Zamir"),
new("email", "[email protected]"),
new("age", 35),
new("city", "Tel Aviv")
});
SearchResult findPaulHashResult = db.FT().Search(
"hash-idx:users",
new Query("Paul @age:[30 40]")
);
foreach (Document doc in findPaulHashResult.Documents)
{
Console.WriteLine(
$"Name: {doc["name"]}, email: {doc["email"]}, " +
$"age: {doc["age"]}, city:{doc["city"]}"
);
}
// >>> Name: Paul Zamir, email: [email protected], age: 35, ...
}
}
请参阅Redis 查询引擎文档,了解包含示例的所有查询功能的完整说明。