首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Suffix在SortFieldDescriptor中的应用

.Suffix在SortFieldDescriptor中的应用
EN

Stack Overflow用户
提问于 2018-08-02 10:32:33
回答 1查看 830关注 0票数 2

我的ASP.NET Web有一个搜索方法,用于在Elasticsearch数据库中搜索特定的查询。此外,用户还可以设置排序参数,如要按属性排序的参数,也可以设置排序参数,或者将其设置为升序或降序。

http://localhost/api/search?query=jon&sortBy=lastname&sortOrder=desc

控制器使用NEST将请求传递给Elasticsearch。

代码语言:javascript
复制
var sortProperty = typeof(T).GetProperty(options.SortBy, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);

var sortOrder = options.SortOrder.IndexOf("desc", System.StringComparison.OrdinalIgnoreCase) >= 0
            ? SortOrder.Descending
            : SortOrder.Ascending;

var result = await this.elasticClient.SearchAsync<Person>(search => search
            .Query(q => q.MultiMatch(m => m
                    .Query(query)))
            .Sort(sort => sort.Field(sfd => sfd
                .Field(new Field(sortProperty))
                .Order(sortOrder)));

sortProperty可以是一个文本字段,就像这个示例中的名字和姓氏一样。为了能够根据这个文本字段进行排序,我添加了"raw“关键字字段。

代码语言:javascript
复制
{
    "people": {
        "mappings": {
            "person": {
                "properties": {
                    "birthdate": {
                        "type": "date"
                    },
                    "firstname": {
                        "type": "text",
                        "fields": {
                            "raw": {
                                "type": "keyword"
                            }
                        }
                    },
                    "id": {
                        "type": "integer"
                    },
                    "lastname": {
                        "type": "text",
                        "fields": {
                            "raw": {
                                "type": "keyword"
                            }
                        }
                    }
                }
            }
        }
    }
}

现在,我必须在属性的名字和姓氏中添加后缀"raw“。

代码语言:javascript
复制
.Sort(sort => sort.Descending(p => p.Firstname.Suffix("raw")));

但是如何将它添加到我在上使用的更通用的版本中,其中sortPropertysortOrder用于创建SortFieldDescriptor?

下面这样的内容不起作用:

代码语言:javascript
复制
.Sort(sort => sort.Field(sfd => sfd
    .Field(new Field(sortProperty).Suffix("raw"))
    .Order(sortOrder)));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 23:01:57

.Suffix()只用于成员表达式。

我认为您可以通过简单地使用字符串来表示字段来简化这一点。

所以,而不是

代码语言:javascript
复制
var sortProperty = typeof(T).GetProperty(options.SortBy, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);

使用PropertyInfo创建一个Field实例,您可以使用

代码语言:javascript
复制
var sortOrder = options.SortOrder.IndexOf("desc", System.StringComparison.OrdinalIgnoreCase) >= 0
            ? SortOrder.Descending
            : SortOrder.Ascending;

var result = await this.elasticClient.SearchAsync<Person>(search => search
            .Query(q => q
                .MultiMatch(m => m
                    .Query(query)
                )
            )
            .Sort(sort => sort
                .Field(sfd => sfd
                    .Field($"{options.SortBy}.raw")
                    .Order(sortOrder)
                )
            );

注意,当从Field实例化string时,字符串值是逐字的,因此它需要匹配Elasticsearch中字段的大小写。相反,表达式和PropertyInfo根据.DefaultFieldNameInferrer() on ConnectionSettings进行转换,默认情况下是camel。

有从stringPropertyInfoExpression<Func<T, object>>Field实例的隐式转换。看一看字段推理文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51651403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档