ElasticSearch:嵌套文档的复杂过滤器

时间:2017-08-02 13:54:54

标签: elasticsearch

我有以下文档结构:

{
    product_name: "Product1",
    product_id: 1,
    ...,
    articles: [
        {
            article_name: 'Article 101',
            id: 101,
            some_param: 10,
            clients: []
        },
        {
            article_name: 'Article 102',
            id: 102,
            some_param: 11,
            clients: [
                {
                    client_id: 10001,
                    client_name: "some client 1001" 
                }
                ...
            ]
        }
    ]
},

{
    product_name: "Product2",
    product_id: 2,
    ...,
    articles: [
        {
            article_name: 'Article 101',
            id: 101,
            some_param: 10,
            clients: []
        },
        {
            article_name: 'Article 102',
            id: 102,
            some_param: 10,
            clients: [
                {
                    client_id: 10001,
                    client_name: "some client 1001" 
                }
                ...
            ]
        }
    ]
}

我需要获取文件(产品),如果它的某些文章符合2个条件(单篇文章应该符合这两个条件):articles.some_param = 10 AND articles.clients.client_id = 10001

所以我只需要获得id为2的产品。

我现在正在使用此查询,这是不正确的(我知道原因),因为它会获取这两个文档:

{
   "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "articles.clients.id": 10001
          }
        },
        {
          "terms": {
            "articles.some_param": 10
          }
        }
      ]              
    }
  }
}

如何编写只有 产品的查询,其中至少有一篇文章符合这两个条件:articles.some_param = 10 AND articles.clients.client_id = 10001

例如,仅获取ID为2的产品?

1 个答案:

答案 0 :(得分:1)

这样的事情:

{
 "query": {
  "nested": {
    "path": "articles",
    "query": {
      "bool": {
        "must": [
              {
                 "term": {
                     "articles.some_param": {
                         "value": 10
                       }
                     }
               },
               {
                 "nested": {
                     "path": "articles.clients",
                        "query": {
                          "term": {
                               "articles.clients.id":{ 
                                 "value": 10001
                            }
                         }
                       }
                  }
               }
           ]
        }
      }
    }
   }
 }

更新: 尝试将第二个查询包装为bool。

{
 "query": {
  "nested": {
    "path": "articles",
    "query": {
      "bool": {
        "must": [
              {
                 "term": {
                     "articles.some_param": {
                         "value": 10
                       }
                     }
               },
               {
                 "bool":{
                   "must" : [
                     {
                     "nested": {
                     "path": "articles.clients",
                        "query": {
                          "term": {
                               "articles.clients.id":{ 
                                 "value": 10001
                            }
                         }
                       }
                     }
                    }
                  ]
                 }
               }
           ]
        }
      }
    }
   }
 }

P.S。我可能会错误地使用第二个嵌套查询上的路径。只是无法检查。因此,您可以在第二个查询中使用路径。

p.p.s。过滤器不是您需要的查询。它不计算分数