elasticsearch - 将 JSON 转换为 Elastic NEST 查询无法按预期工作
问题描述
我正在尝试将以下 JSON 转换为 NEST,但它没有按预期工作。它确实将字段与网站匹配,但与范围不匹配,所以我得到了一些非常旧的结果。
使用 Kibana 进行搜索时,我发送此请求:
"query": {
"bool": {
"must": [],
"filter": [
{
"bool": {
"should": [
{
"match": {
"domain": "website.com"
}
}
],
"minimum_should_match": 1
}
},
{
"range": {
"@timestamp": {
"gte": "2020-08-03T12:37:07.821Z",
"lte": "2020-08-18T12:37:07.821Z",
"format": "strict_date_optional_time"
}
}
}
],
"should": [],
"must_not": []
}
},
并转换为 NEST:
SearchDescriptor<ApacheRequest> Query(SearchDescriptor<ApacheRequest> qc)
{
var query = qc.Query(q =>
q.Bool(b =>
b.Filter(f =>
f.Bool(fb =>
fb.Should(sh =>
sh.Match(ma => ma
.Field(x => x.Domain)
.Query("website.com")
)
)
),
f => f.Range(r => r.GreaterThanOrEquals(timestamp))
)
)
);
return query;
}
正如我所说,它匹配域,但不匹配范围。一个月前我得到了结果,即使我已经测试过我的结果timestamp
是正确的。
我究竟做错了什么?
解决方案
Ah, I found the issue.. I'm not supposed to use .Range()
but rather .DateRange()
. Now my query looks like this:
SearchDescriptor<ApacheRequest> Query(SearchDescriptor<ApacheRequest> qc)
{
var query = qc.Query(q =>
q.Bool(b =>
b.Filter(f =>
f.Bool(fb =>
fb.Must(sh =>
sh.Match(ma => ma
.Field(x => x.Domain)
.Query("website.com")
)
)
),
f => f.DateRange(r =>
r.Field(fi => fi.Timestamp).GreaterThanOrEquals(from)
)
)
)
);
return query;
}
推荐阅读
- laravel - 控制器的请求值没有得到选择的值
- reactjs - 动态添加类以响应组件
- javascript - 根据其他对象的数组属性对对象数组进行排序的最快方法
- python - `lambda: class(class, class, ...)` 语法是什么意思?(扭曲的 Python 文档)
- javascript - 使用 javascirpt 在单个数组上对多个属性进行分组
- symfony - Symfony ICU 翻译在翻译后的消息后尾随换行符
- android - kotlin + Dagger 2:没有 @Provides 注释的方法无法提供 ApiService
- java - 使用 RxJava 向下传递变量的正确方法是什么?
- azure - Terraform Azure 如何获取 AKS 服务主体对象 ID
- assets - redmine plugin_assets 仍然为空