ES 6.2
我有一组这样的文件:
{
"_source": {
"tasks": [
{
"dueDate": null,
"candidate": {
"groups": [],
"users": []
},
"id": "0"
}
]
}
}
{
"_source": {
"tasks": [
{
"dueDate": "2018-06-28...", // <= correct date string
"candidate": {
"groups": ["admin"],
"users": []
},
"id": "1"
}
]
}
}
{
"_source": {
"tasks": [
{
"dueDate": null,
"candidate": {
"groups": ["worker", "janitor"],
"users": ["testuser02"]
},
"id": "2"
},
{
"dueDate": null,
"candidate": {
"groups": [],
"users": ["testuser01", "testuser02"]
},
"id": "3"
}
]
}
}
基本上,它是一系列任务列表,每个任务列表都允许对特定用户或组成员或每个人执行,如果用户和组候选列表都是空。
此外,还有一个dueDate
概念,它必须是过去或根本没有指定,因此此文档会显示在我们的搜索结果中。
我正在撰写一个查询,这是我迄今为止所做的。我还没有完成,因为文档中的某些内容让我感到困惑,例如&#34; must_not
...子句在过滤器上下文中执行,这意味着忽略评分并考虑使用子句进行缓存。&#34 ;。从我的SQL过去开始,如果我想使用索引,我已经教会自己避免having
条款,并且我有一种感觉&#34;过滤上下文&#34;是having
...
请注意:我仍然希望搜索尽可能准确。以前对于简单查询,如果我使用术语查询和&#34; .keyword&#34;结束我在这里提到的字段名称:
https://www.elastic.co/blog/strings-are-dead-long-live-strings
对于这个非常复合的查询,我觉得我也需要添加它,但仍然无法理解在哪里。
{
"bool": {
"must": [
{
"bool": {
"should": [
{
"bool": {
"must_not": {
"exists": {
"field": "tasks.dueDate"
}
}
},
"range": {
"tasks.dueDate": {
"gte": "now"
}
}
}
]
}
},
{
"bool": {
"should": [
{
"bool": {
"must_not": [{
"exists": {
"field": "tasks.candidate.users"
}
},
{
"exists": {
"field": "tasks.candidate.groups"
}
}]
},
"terms": {
"tasks.candidate.users": [
"testuser01",
"testuser02"
]
},
"terms": {
"tasks.candidate.groups": [
"admin",
"staff"
]
}
}
]
}
}
]
}
}
当然,&#34; testuser **&#34;,&#34; admin&#34;和&#34;员工&#34;是为每个特定搜索修改的可变部分。
什么是正确的查询?