在嵌套文档中搜索多个字段,在Elasticsearch中用or子句分隔

时间:2018-12-17 07:38:39

标签: elasticsearch

问题的标题不能完全证明我的要求。我有一个表格形式的嵌套文档

{
    "tags": [
        {
            "context": "context_pic_elements",
            "name": "walls",
            "created_at": 1542806972000,
            "tag_id": 48,
            "tagging_id": 1225
        },
        {
            "context": "element",
            "name": "solo",
            "created_at": 1542806972000,
            "tag_id": 47,
            "tagging_id": 1226
        },
        {
            "context": "end_use",
            "name": "home renovation",
            "created_at": 1542806972000,
            "tag_id": 45,
            "tagging_id": 1224
        }
    ],
    "name": "Wall patterns",
}

文档被映射为

{
  "properties": {
    "name": {
      "type": "text"
    },
    "tags": {
      "type": "nested",
      "properties": {
        "name": { "type": "keyword" },
        "context": { "type": "keyword" },
        "tag_id": { "type": "integer" }
      }
    }
  }
}

我希望能够以

的形式查询图像
images WHERE
    (tags.context="context_pic_elements" AND tags.name="walls")
    OR (tags.context="element" AND tags.name="solo")

我正在尝试的查询是

{
  "query": {
    "nested" : {
      "path" : "tags",
      "query": {
        "bool": {
          "should" : {
            "bool": {
              "must": [
                {"term": {"tags.context": "context_pic_elements"}},
                {"term": {"tags.name": "walls"}}
              ]
            }
          }
        }
      }
    }
  }
}

这使我可以查询AND子句的第一个条件。我在查询的第二个AND条件(弹性搜索不允许在其查询中使用多个must子句)的位置,以便我可以同时通过这两个条件进行查询。我看着elasticsearch bool query combine must with OR,但这不是我所需要的。

1 个答案:

答案 0 :(得分:2)

由于嵌套文档是单独的文档,因此您需要以另一种方式进行操作,即OR两个嵌套子句而不是嵌套两个OR子句,它是这样的:

POST index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "tags.context": "context_pic_elements"
                    }
                  },
                  {
                    "term": {
                      "tags.name": "walls"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "tags.context": "element"
                    }
                  },
                  {
                    "term": {
                      "tags.name": "solo"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}