ElasticSearch 5. *,查询:字段不存在或者如果存在值应该是这个

时间:2016-12-27 06:05:08

标签: elasticsearch nest elasticsearch-5

在下面考虑停止字段是时间戳字段。

我想过滤以下条件的数据:

  1. 停止字段不存在
  2. 或,停止字段值为> = now
  3. 我知道,我应该使用must_not但不知道如何。

    我想对子类型进行一些评分,并使用此分数对父级进行排序,然后使用停止字段过滤掉父级。

    GET indexName/parentType/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "has_child": {
                "type": "child-type",
                "score_mode": "max",
                "query": {
                  "function_score": {
                    "functions": [
                      {
                        "script_score": {
                          "script": {
                            "file": "score-analytics",
                            "lang": "expression"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "range": {
                      "stop": {
                        "gte": "now"
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
    

2 个答案:

答案 0 :(得分:0)

您需要使用现有过滤器:

"bool": 
      { "should":[
         { "range": 
             { "stop": 
                 { "gte": "now" }
             }
         },
         { "query": 
           { "exists" : 
              { "field" : "stop" } 
            }  
          }
 ] }

答案 1 :(得分:0)

如果您使用must_not bool条件来过滤该字段不存在,该怎么办?您的查询可能如下所示:

"query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "exists": {
                "field": "stop" <-- give the field which shouldn't exist
              }
            }
          ]
        }
      }
    }
  }

以上是一个示例,以便您可以重现。对于第二个条件,似乎正如您所做的那样使用range查询。我几乎无法确保获得时间戳range的更好方法。希望它有所帮助!