具有多个OR和数组的复合Elasticsearch查询为空或包含条目

时间:2018-06-16 16:12:44

标签: elasticsearch

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;是为每个特定搜索修改的可变部分。

什么是正确的查询?

0 个答案:

没有答案