2017-08-02 74 views
0

我有以下的文档结构复杂的过滤器: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个条件(单件物品应符合两个条件):文章.some_param = 10,articles.clients.client_id = 10001

所以我需要得到唯一的产品ID为2

我现在使用此查询,这是不正确的(我知道为什么),因为它提取这两个文件:

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

我如何写查询它得到只有具有至少1条它匹配两个条件产品:articles.some_param = 10,articles.clients.client_id = 10001

例如,仅使用ID 2产品?

+0

您需要嵌套类型以使其按照您的方式工作。 https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html – khachik

+0

它们已经设置为嵌套类型。我相信这个问题与嵌套类型无关。上面的查询的行为应该是,但它不符合我的要求。 “获得至少有1条符合两个条件的商品:articles.some_param = 10 AND articles.clients.client_id = 10001”) – Teimuraz

回答

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 
          } 
         } 
         } 
        } 
       } 
      ] 
     } 
     } 
    } 
    } 
} 

UPDATE: 尝试换第二查询布尔。

{ 
"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.该过滤器不是您所需要的查询。它不计算分数

+0

它不起作用。我仍然使用此查询获得两种产品。我只需要获得第二个 – Teimuraz

+0

您可以用bool查询包装第二个嵌套查询。我会更新,你可以看到。 BTW很高兴看到你的映射。 – SouXin

+0

似乎第二个作品,谢谢! (我不需要计算分数) – Teimuraz