将 RediSearch 与 NRediSearch (C#) 结合使用,如何在 i.CountyId == id || 等两个数字字段上应用 OR 子句i.CityId == ID
Using RediSearch with NRediSearch (C#), how to apply OR clause on two numeric fields like i.CountyId == id || i.CityId == id
我正在使用 RediSearch 开发 .Net Core
网络应用程序。之前用过in-app memory cache,现在改成distributed cache了。问题是,Web 应用程序具有非常复杂的搜索,必须从缓存中处理。我虽然只是将缓存移动到 Redis
并且必须在 Linq
中进行过滤,但与应用程序内内存缓存一样,但如果您在 Redis 中有 500K+ 个条目,则使用 docker 同一主机上的图像花了大约 4 秒才将这些条目加载到变量中,因此这不是一个选项。
我现在已经用 NRediSearch
实现了 RediSearch
,这似乎可以很好地处理负载。我现在遇到的问题是,我有多个位置字段的搜索。
示例
class Item{
public int Id {get;set;}
public int CountyId {get;set;}
public int CityId {get;set;}
}
class Location{
public int LocationId {get;set;}
public bool IsCounty {get;set;}
}
我需要将下面的 Linq
命令翻译成 RediSearch
public List<Item> Search(List<Location> location){
var result = items.Where(i => location.Any(l => l.IsCounty && l.Id == i.CountyId) || location.Any(l => !l.IsCounty && i.CityId == l.Id))
}
我已阅读 RediSearch
文档,但尚未找到任何答案。由于排序,我必须在一次搜索中执行此操作。
我找到了他的答案。
FT.SEARCH idx "@title|body:(hello world) @url|image:mydomain"
可能如果 NRediSearch
可以在新查询中处理此 or 运算符,如果不能,则必须直接通过其客户端实现
您可以使用我在 nredisearch 上构建的库。但它适用于简单的 linq 查询。它不适用于嵌套对象。如果你能为它的发展做出贡献,我将很高兴。
如果我们谈论您的示例,您必须像这样为每个位置复制数据:
class Item {
public int Id {get;set;}
public int CountyId {get;set;}
public int CityId {get;set;}
public int LocationId {get;set;}
public bool IsCounty {get;set;}
}
你可以用我的图书馆搜索这个达哈。
包管理器:
Install-Package RedisworkCore
Dotnet CLI:
dotnet add package RedisworkCore
并且您可以创建类似 entityframework:
的上下文
public class Person
{
[RedisKey(0)]
public int Id { get; set; }
public string Name { get; set; }
public string Lastname { get; set; }
}
public class SimpleContext : RedisContext
{
public Rediset<Person> Persons { get; set; }
public SimpleContext(RedisContextOptions options) : base(options) { }
}
然后您可以使用 Find、Where、Any、All、SortBy、SortByDescending、Skip、Take 类似的 LINQ。
static async Task Main(string[] args)
{
RedisContextOptions options = new RedisContextOptions
{
HostAndPort = "localhost:6379"
};
using (var context = new SimpleContext(options))
{
var person = new Person
{
Id = 26,
Name = "Emre",
Lastname = "Hızlı"
};
context.Persons.Add(person);
await context.SaveChangesAsync();
}
using (var context = new SimpleContext(options))
{
Person person = await context.Persons.Find(26);
List<Person> persons = await context.Persons.Where(x => x.Id > 0).ToListAsync();
}
}
备注:
- 您应该使用 redisworkcore 保存您的数据,否则它将无法工作。
- 没有进行性能测试。如果我能作为开源获得支持,它可能会更好。
我正在使用 RediSearch 开发 .Net Core
网络应用程序。之前用过in-app memory cache,现在改成distributed cache了。问题是,Web 应用程序具有非常复杂的搜索,必须从缓存中处理。我虽然只是将缓存移动到 Redis
并且必须在 Linq
中进行过滤,但与应用程序内内存缓存一样,但如果您在 Redis 中有 500K+ 个条目,则使用 docker 同一主机上的图像花了大约 4 秒才将这些条目加载到变量中,因此这不是一个选项。
我现在已经用 NRediSearch
实现了 RediSearch
,这似乎可以很好地处理负载。我现在遇到的问题是,我有多个位置字段的搜索。
示例
class Item{
public int Id {get;set;}
public int CountyId {get;set;}
public int CityId {get;set;}
}
class Location{
public int LocationId {get;set;}
public bool IsCounty {get;set;}
}
我需要将下面的 Linq
命令翻译成 RediSearch
public List<Item> Search(List<Location> location){
var result = items.Where(i => location.Any(l => l.IsCounty && l.Id == i.CountyId) || location.Any(l => !l.IsCounty && i.CityId == l.Id))
}
我已阅读 RediSearch
文档,但尚未找到任何答案。由于排序,我必须在一次搜索中执行此操作。
我找到了他的答案。
FT.SEARCH idx "@title|body:(hello world) @url|image:mydomain"
可能如果 NRediSearch
可以在新查询中处理此 or 运算符,如果不能,则必须直接通过其客户端实现
您可以使用我在 nredisearch 上构建的库。但它适用于简单的 linq 查询。它不适用于嵌套对象。如果你能为它的发展做出贡献,我将很高兴。
如果我们谈论您的示例,您必须像这样为每个位置复制数据:
class Item {
public int Id {get;set;}
public int CountyId {get;set;}
public int CityId {get;set;}
public int LocationId {get;set;}
public bool IsCounty {get;set;}
}
你可以用我的图书馆搜索这个达哈。
包管理器:
Install-Package RedisworkCore
Dotnet CLI:
dotnet add package RedisworkCore
并且您可以创建类似 entityframework:
的上下文public class Person
{
[RedisKey(0)]
public int Id { get; set; }
public string Name { get; set; }
public string Lastname { get; set; }
}
public class SimpleContext : RedisContext
{
public Rediset<Person> Persons { get; set; }
public SimpleContext(RedisContextOptions options) : base(options) { }
}
然后您可以使用 Find、Where、Any、All、SortBy、SortByDescending、Skip、Take 类似的 LINQ。
static async Task Main(string[] args)
{
RedisContextOptions options = new RedisContextOptions
{
HostAndPort = "localhost:6379"
};
using (var context = new SimpleContext(options))
{
var person = new Person
{
Id = 26,
Name = "Emre",
Lastname = "Hızlı"
};
context.Persons.Add(person);
await context.SaveChangesAsync();
}
using (var context = new SimpleContext(options))
{
Person person = await context.Persons.Find(26);
List<Person> persons = await context.Persons.Where(x => x.Id > 0).ToListAsync();
}
}
备注:
- 您应该使用 redisworkcore 保存您的数据,否则它将无法工作。
- 没有进行性能测试。如果我能作为开源获得支持,它可能会更好。