我的ASP.NET Web有一个搜索方法,用于在Elasticsearch数据库中搜索特定的查询。此外,用户还可以设置排序参数,如要按属性排序的参数,也可以设置排序参数,或者将其设置为升序或降序。
http://localhost/api/search?query=jon&sortBy=lastname&sortOrder=desc
控制器使用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"
}
}
}
}
}
}
}
}现在,我必须在属性的名字和姓氏中添加后缀"raw“。
.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)));发布于 2018-08-02 23:01:57
.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() on ConnectionSettings进行转换,默认情况下是camel。
有从string、PropertyInfo和Expression<Func<T, object>>到Field实例的隐式转换。看一看字段推理文档。
https://stackoverflow.com/questions/51651403
复制相似问题