Lucene 使用Where()查询Raven时,是否只对前128个文档进行筛选?

Lucene 使用Where()查询Raven时,是否只对前128个文档进行筛选?,lucene,ravendb,Lucene,Ravendb,我们正在使用Raven验证登录,以便人们可以进入我们的网站 我们发现,如果您这样做: // Context is an IDocumentSession Context.Query<UserModels>() .SingleOrDefault(u => u.Email.ToLower() == email.ToLower()); //上下文是一个IDocumentSession Context.Query() .SingleOrDefault(u=>

我们正在使用Raven验证登录,以便人们可以进入我们的网站

我们发现,如果您这样做:

// Context is an IDocumentSession 
Context.Query<UserModels>()
           .SingleOrDefault(u => u.Email.ToLower() == email.ToLower()); 
//上下文是一个IDocumentSession
Context.Query()
.SingleOrDefault(u=>u.Email.ToLower()==Email.ToLower());
该查询仅筛选中文档的前128个文档 掠夺我们的数据库中有几千个,所以除非你 电子邮件恰好在第一次返回的128封邮件中,你运气不好

没有Raven示例代码或任何 我在网上遇到的示例代码使用 Skip()和Take()循环遍历集合

  • 这是乌鸦想要的行为吗
  • 即使使用高级Lucene查询,行为是否相同?ie;高级查询的行为有什么不同吗
  • 下面的解决方案合适吗?看起来有点难看P
  • 我的解决方案是循环遍历所有文档集,直到 遇到非空结果,则中断并返回

    public T SingleWithIndex(string indexName, Func<T, bool> where)
    {
        var pageIndex = 1;
        const int pageSize = 1024;
        RavenQueryStatistics stats;
    
    var queryResults = Context.Query<T>(indexName)
        .Statistics(out stats)
        .Customize(x => x.WaitForNonStaleResults())
        .Take(pageSize)
        .Where(where).SingleOrDefault();
    
    if (queryResults == null && stats.TotalResults > pageSize)
    {
        for (var i = 0; i < (stats.TotalResults / (pageIndex * pageSize)); i++)
        {
            queryResults = Context.Query<T>(indexName)
                .Statistics(out stats)
                .Customize(x => x.WaitForNonStaleResults())
                .Skip(pageIndex * pageSize)
                .Take(pageSize)
                .Where(where).SingleOrDefault();
    
            if (queryResults != null) break;
    
            pageIndex++;
        }
    
    }
    
    return queryResults;
    
    public T SingleWithIndex(字符串索引名,Func-where)
    {
    var pageIndex=1;
    常量int pageSize=1024;
    拉文奎尔统计数据;
    var queryResults=Context.Query(indexName)
    .统计数据(统计数据)
    .Customize(x=>x.WaitForNonSaleResults())
    .Take(页面大小)
    .Where(Where.SingleOrDefault();
    if(queryResults==null&&stats.TotalResults>pageSize)
    {
    对于(var i=0;i<(stats.TotalResults/(pageIndex*pageSize));i++)
    {
    queryResults=Context.Query(indexName)
    .统计数据(统计数据)
    .Customize(x=>x.WaitForNonSaleResults())
    .Skip(页面索引*页面大小)
    .Take(页面大小)
    .Where(Where.SingleOrDefault();
    如果(queryResults!=null)中断;
    pageIndex++;
    }
    }
    返回查询结果;
    
    }

    编辑:

    使用下面的修复程序不会将查询参数传递给我的RavenDB实例。还不知道为什么

    Context.Query<UserModels>()
        .Where(u => u.Email == email)
        .SingleOrDefault();
    
    Context.Query()
    .其中(u=>u.电子邮件==电子邮件)
    .SingleOrDefault();
    

    最后,我使用高级Lucene语法而不是linq查询,一切正常。

    RavenDB不理解
    SingleOrDefault
    ,因此它在没有过滤器的情况下执行查询。然后在结果集上执行您的条件,但默认情况下Raven只返回前128个文档。 相反,你必须打电话

    Context.Query()
    .其中(u=>u.电子邮件==电子邮件)
    .SingleOrDefault();
    

    所以过滤是由RavenDB/Lucene完成的。

    我将此交叉发布到google组,Ayende提到他们还不支持SingleOrDefault()中的谓词。我的问题是linq查询没有将查询参数传递给我的服务器。