node.js - 如何检查嵌套对象内是否存在所有值elasticsearch

标签 node.js elasticsearch elasticsearch-5

我在 ES 中有以下文档:

[
  {
    "event_id": 123,
    "event_name": "test event",
    "event_date": "2018-12-21",
    "ticket_group": [
      {
        "available": 8,
        "price": 8,
        "id": "159831",
        "parking_passes_available": 0,
        "field_values": [
          {
            "field_id": 589,
            "field_value": "KUMAR"
          },
          {
            "field_id": 717,
            "field_value": "AMIT"
          },
          {
            "field_id": 1360,
            "field_value": "SAM"
          },
          {
            "field_id": 2239,
            "field_value": ""
          },
          {
            "field_id": 2240,
            "field_value": ""
          },
          {
            "field_id": 2241,
            "field_value": ""
          },
          {
            "field_id": 2242,
            "field_value": ""
          }
        ]
      }
    ]
  }
]

我想使用 AND 运算符搜索多个 field_id 和 field_value 。但如果有单一条件,但不适用于多种情况,则它有效。这是我到目前为止所尝试过的:

    {
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "ticket_group",
            "score_mode": "max",
            "inner_hits": {
              "from": 0,
              "size": 10000
            },
            "query": {
              "bool": {
                "must": [
                  {
                    "nested": {
                      "path": "ticket_group.field_values",
                      "score_mode": "max",
                      "inner_hits": {
                        "from": 0,
                        "size": 10000
                      },
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "bool": {
                                "must": [
                                  {
                                    "match": {
                                      "ticket_group.field_values.field_id": 589
                                    }
                                  },
                                  {
                                    "match": {
                                      "ticket_group.field_values.field_value": "KUMAR"
                                    }
                                  }
                                ]
                              }
                            },
                            {
                              "bool": {
                                "must": [
                                  {
                                    "match": {
                                      "ticket_group.field_values.field_id": 717
                                    }
                                  },
                                 {
                                    "match": {
                                      "ticket_group.field_values.field_value": "AMIT"
                                    }
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  "size": 10,
  "from": 0,
  "sort": {
    "event_date": {
      "order": "asc"
    }
  }
}

如果 Ticket_group 内的 field_values 对象中存在值为“amit”的 field_id=717 和值为“kumar”的 field_id=589,我想搜索工单组。使用上面的查询我没有得到任何记录,而具有这两个值的对象都存在于 field_values 中。 任何人都可以帮助构建这样的查询吗?

谢谢

最佳答案

以下是您要查找的内容。您只需将第二级嵌套到两个 must 子句中即可。

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "nested":{  
                  "path":"ticket_group",
                  "score_mode":"max",
                  "inner_hits":{  

                  },
                  "query":{  
                     "bool":{  
                        "must":[  
                           {  
                              "nested":{  
                                 "path":"ticket_group.field_values",
                                 "score_mode":"max",
                                 "inner_hits":{  
                                    "name":"inner_clause_1"
                                 },
                                 "query":{  
                                    "bool":{  
                                       "must":[  
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_id":589
                                             }
                                          },
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_value":"KUMAR"
                                             }
                                          }
                                       ]
                                    }
                                 }
                              }
                           },
                           {  
                              "nested":{  
                                 "path":"ticket_group.field_values",
                                 "score_mode":"max",
                                 "inner_hits":{  
                                    "name":"inner_clause_2"
                                 },
                                 "query":{  
                                    "bool":{  
                                       "must":[  
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_id":717
                                             }
                                          },
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_value":"AMIT"
                                             }
                                          }
                                       ]
                                    }
                                 }
                              }
                           }
                        ]
                     }
                  }
               }
            }
         ]
      }
   }
}

请注意,我已在第二级嵌套查询中命名了inner_hits

如果您不这样做(尝试删除 inner_hits 中的 name 键),那么您只会看到最后一个子句inner_hit,最终会覆盖第一个嵌套子句inner_hits 结果。

希望这有帮助!

关于node.js - 如何检查嵌套对象内是否存在所有值elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759385/

相关文章:

node.js - Dynamodb TTL 24 小时

python - 如何解析嵌套json对象的元素?

shell - 使用 'yes'安装X-Pack时,要安装Elasticsearch的Shell脚本会引发错误

java - 使用 Elasticsearch 创建具有 .keyword 后缀的字段的 Hibernate 搜索

elasticsearch - Elasticsearch 2.x至5.x查询问题

node.js - 如何在 Angular 和 Node.js 中使用 socket.io?

Node.js/Express/Mocha/Supertest Rest API - 空请求正文

python - AWS Elasticsearch 服务角色权限

node.js - Express - 从 Web 服务返回二进制数据

elasticsearch - 将数据从PostgreSQL索引到Elasticsearch