使用带有nredisearch(c#)的redisearch,如何在两个数字字段上应用or子句,如i.countyid==id | | i.cityid==id

o0lyfsai  于 2021-06-08  发布在  Redis
关注(0)|答案(2)|浏览(503)

我正在开发一个 .Net Core 重新搜索的web应用程序。以前我使用的是应用内存缓存,但我必须将其更改为分布式缓存。问题是,web应用程序有非常复杂的搜索,必须从缓存中处理。我想我只是把缓存移到 Redis 必须过滤进去 Linq 将与应用程序内存缓存保持相同,但如果redis中有500k+个条目,则在同一主机上使用docker映像只需4秒钟即可将这些条目加载到变量中,因此这不是一个选项。
我现在已经实现了 RediSearchNRediSearch 它似乎能很好地处理负载。我现在的问题是,我有一个搜索多个位置字段。
例子

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 Search(List 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` 文档,但尚未找到任何答案。我必须在一次搜索中这样做,因为排序。
4ngedf3f

4ngedf3f1#

你可以使用我的图书馆,我建立在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;}
}

你可以用我的图书馆来搜索这个达哈。
再工作核
Package 经理: 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 similar 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保存数据,否则它将无法工作。
没有进行性能测试。如果我能得到开源的支持,它可能会工作得更好。

ttygqcqt

ttygqcqt2#

我找到了他的答案。

FT.SEARCH idx "@title|body:(hello world) @url|image:mydomain"

可能如果 NRediSearch 可以在新查询中处理此or运算符,如果不能,则必须直接通过其客户端实现

相关问题