【问题标题】:Ordering a query by the string length of one of the fields按字段之一的字符串长度对查询进行排序
【发布时间】:2013-04-12 08:01:55
【问题描述】:

在 RavenDB(内部版本 2330)中,我尝试按索引项之一的字符串长度对结果进行排序。

var result = session.Query<Entity, IndexDefinition>()
                    .Where(condition)
                    .OrderBy(x => x.Token.Length);

但是,结果看起来没有排序。这在 RavenDB 中是否可行(或通过 Lucene 查询)?如果可以,语法是什么?

【问题讨论】:

    标签: lucene ravendb lucene.net


    【解决方案1】:

    您需要向 IndexDefinition 添加一个字段以进行排序,并将 define the SortOption 添加到 Int 或更合适的内容(但是您不想使用默认的 String)。

    如果您想像示例中那样使用 Linq API,您需要将一个名为 Token_Length 的字段添加到索引的 Map 函数(请参阅 Matt 的评论):

    from doc in docs
         select new
         {
             ...
             Token_Length = doc.TokenLength
         }
    

    然后您可以使用 Linq API 进行查询:

    var result = session.Query<Entity, IndexDefinition>()
                        .Where(condition)
                        .OrderBy(x => x.Token.Length);
    

    或者,如果您真的希望该字段被称为 TokenLength(或 Token_Length 以外的其他名称),您可以使用 LuceneQuery:

    from doc in docs
         select new 
         {
             ...
             TokenLength = doc.Token.Length
         }
    

    你会这样查询:

    var result = session.Advanced.LuceneQuery<Entity, IndexDefinition>()
                        .Where(condition)
                        .OrderBy("TokenLength");
    

    【讨论】:

    • 是的。而且,如果该字段使用名称Token_Length 进行索引,那么他可以只使用原始问题中显示的 linq 查询。 (默认的翻译约定是将句点映射到下划线。)正如您所提到的,重要的部分是将排序顺序定义为 int。
    猜你喜欢
    • 2011-11-26
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多