2015-05-08 50 views
4

好吧,对于你们其中一位超级棒的ElasticSearch专家来说,这可能不会太难。我有这个嵌套查询,我想嵌套查询在非嵌套字段(状态)上过滤。我不知道在哪里放置过滤器。我试着把它放在一个查询中(下面),但这并没有给我正确的结果。你能帮我吗?ElasticSearch带过滤器的嵌套查询

{ 
    "aggs": { 
    "status": { 
     "terms": { 
     "field": "status", 
     "size": 0 
     } 
    } 
    }, 
    "filter": { 
    "nested": { 
     "path": "participants", 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "user_id": 1 
       } 
      }, 
      { 
       "term": { 
       "archived": false 
       } 
      }, 
      { 
       "term": { 
       "has_unread": true 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must_not": [ 
      { 
       "term": { 
       "status": 8 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

回答

12

有几个动件的位置:

  1. The top-level filter that you are using is a "post filter",其目的是后删除的东西聚合(S)已经处理了。这很令人讨厌,它存在这种方式,但它在0.90天内被弃用,它将在Elasticsearch 5.0中完全删除。

    通过将它放入已过滤的查询中,您很可能会获得更好的性能,更不用说它听起来像是您的目标。

    • 替换它更合适地命名为post_filter
  2. nested filter的条款使用的完整路径领域,你应该做的是

    { 
        "term": { 
        "user_id": 1 
        } 
    } 
    

    应该是:

    { 
        "term": { 
        "participants.user_id": 1 
        } 
    } 
    

    同样遵循为嵌套对象的其余部分。

  3. 假设您不希望status8,那么您就完美了。

  4. 使用的聚集0一个size意味着你会得到一切。这对于较小的数据集可以正常工作,但是对于较大的数据集,这会很痛苦。

全部放在一起(顺序无关,但它通常是一个好主意,把聚合后查询部分,因为这是它是如何执行):

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must" : { 
      "nested" : { 
       "path" : "participants", 
       "filter": { 
       "bool": { 
        "must": [ 
        { 
         "term": { 
         "participants.user_id": 1 
         } 
        }, 
        { 
         "term": { 
         "participants.archived": false 
         } 
        }, 
        { 
         "term": { 
         "participants.has_unread": true 
         } 
        } 
        ] 
       } 
       } 
      } 
      }, 
      "must_not": { 
      "term": { 
       "status": 8 
      } 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "status": { 
     "terms": { 
     "field": "status", 
     "size": 0 
     } 
    } 
    } 
} 

注:我改变数组中的“must_not”部分到单个对象。 使用数组语法总是没有错,但我只是没有表明这两种格式都起作用。当然,如果您使用多个项目,那么您必须使用数组语法。

+0

谢谢你的回答!我不仅能够使查询正常工作,而且还了解了一些事情。非常感激。 – Cari