![](/img/trans.png)
[英]How to Map dynamically the properties of a JObject in C# using Elasticsearch Nest
[英]How to dynamically create query using NEST for Elasticsearch
我正在尝试使用NEST根据用户的输入动态创建搜索查询。
我有一个带有用户输入的Filter类:
Public class ProductFilter
{
public string Name { get; set; }
public DateTime? PublishDateFrom { get; set; }
}
但是对于Name和PublishDateFrom之类的属性,如果用户未指定,则它们可以为空或为null。
因此,使用NEST进行搜索时,如以下代码所示:
var response1 = await client.SearchAsync<ProjectDocument>(s => s
.Index(Indices.Parse("products"))
.From(0)
.Size(10000)
.Type("product")
.Query(q => q
.....
)
);
我想解决一次搜索全部中Name或PublishDateFrom为空或为null的情况。
现在,如果我使用:
...
.Query(q => q
.Term(p => p.Name, filter.Name)
当filter.Name为空或为null时,搜索结果为空。 我想要类似的东西:如果filter.Name为空或为null,则不会执行与Name相关的术语查询或将其包含在SearchAsync调用中。 当Name和PublishDateFrom为空或为null时,则查询应使用.MatchAll()。
我正在尝试使用布尔查询,但也不能处理这种情况。
有什么好办法解决这个问题吗?
NEST已经就此提出了有关的概念Conditionless查询 。 检查以下各项的输出
var filter = new ProductFilter();
client.Search<ProjectDocument>(s => s
.Index("products")
.From(0)
.Size(10000)
.Query(q => +q
.Term(p => p.Name, filter.Name) && +q
.DateRange(d => d
.Field(f => f.PublishDateFrom)
.GreaterThan(filter.PublishDateFrom)
)
)
);
此查询利用查询运算符重载的优势来更轻松地构建bool
查询。
在filter
实例上同时具有两个null
属性时,搜索请求为
POST http://localhost:9200/products/projectdocument/_search?pretty=true
{
"from": 0,
"size": 10000
}
未指定query
与match_all
查询相同。
如果我们将filter
更改为
var filter = new ProductFilter
{
Name = "foo"
};
然后我们收到以下请求
POST http://localhost:9200/products/projectdocument/_search?pretty=true
{
"from": 0,
"size": 10000,
"query": {
"bool": {
"filter": [
{
"term": {
"name": {
"value": "foo"
}
}
}
]
}
}
}
如果我们将filter
更改为
var filter = new ProductFilter
{
Name = "foo",
PublishDateFrom = DateTime.UtcNow.Date
};
我们得到
POST http://localhost:9200/products/projectdocument/_search?pretty=true
{
"from": 0,
"size": 10000,
"query": {
"bool": {
"filter": [
{
"term": {
"name": {
"value": "foo"
}
}
},
{
"range": {
"publishDateFrom": {
"gt": "2017-06-25T00:00:00Z"
}
}
}
]
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.