作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的ASP.NET Web API具有Search方法,可在Elasticsearch数据库中搜索特定查询。用户还可以设置排序参数(例如属性)以进行排序,或者是否应按升序或降序排序。http://localhost/api/search?query=jon&sortBy=lastname&sortOrder=desc
Controller 使用NEST将请求传递给Elasticsearch。
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”关键字字段。
{
"people": {
"mappings": {
"person": {
"properties": {
"birthdate": {
"type": "date"
},
"firstname": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"id": {
"type": "integer"
},
"lastname": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
}
.Sort(sort => sort.Descending(p => p.Firstname.Suffix("raw")));
sortProperty
和
sortOrder
用于创建SortFieldDescriptor?
.Sort(sort => sort.Field(sfd => sfd
.Field(new Field(sortProperty).Suffix("raw"))
.Order(sortOrder)));
最佳答案
.Suffix()
仅旨在与成员表达式一起使用。
我认为您可以通过使用字符串表示字段来简化此操作。
所以,代替
var sortProperty = typeof(T).GetProperty(options.SortBy, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);
PropertyInfo
创建
Field
的实例,您可以使用
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()
上的
ConnectionSettings
转换的,默认情况下会是驼峰式的。
string
,
PropertyInfo
和
Expression<Func<T, object>>
隐式转换为
Field
实例。看看
Field inference documentation。
关于c# - 在SortFieldDescriptor中使用.Suffix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51651403/
我是一名优秀的程序员,十分优秀!