ElasticSearch嵌套bool查询

时间:2017-11-15 09:08:25

标签: elasticsearch nested-query

我正在使用ElasticSearch 5.6。我有以下JSON文档。

set(VTK_INCLUDE_DIRS
    "D:/libs/VTK-7.1.1"
)

set(VTK_QT_INCLUDE_DIR
    "D:/libs/VTK-7.1.1/GUISupport/QtOpenGL"
)

include_directories(${VTK_INCLUDE_DIRS} ${VTK_QT_INCLUDE_DIR})

如果所有给定的用户名和相应的is_selected值为true,我想返回此文档。

这是我的疑问。

    {
          "cards": [{
                        "tag_categories": [
                            {
                                "is_sensitive": true,
                                "category": "Users",
                                "tags": [
                                    {
                                        "is_selected": true,
                                        "name": "user1"
                                    },
                                    {
                                        "is_selected": true,
                                        "name": "user2"
                                    },
                                    {
                                        "is_selected": false,
                                        "name": "user3"
                                    }
                                ]
                            }
                        ],
                        "risk": "medium",
                        "position": 1,
                        "placement": 4,
                        "title": "test title",

                    }, ...]
       }

我添加了两个子bool查询以匹配每组用户名和is_selected值。如果为true,则父bool查询将获取{ "_source": { "excludes": ["cards.pages"] }, "query": { "bool": { "must": [{ "match": { "_all": "hello world" } }], "filter": [{ "nested": { "path": "cards.tag_categories.tags", "query": { "bool": { "must": [ { "bool": { "must": [ { "match": { "cards.tag_categories.tags.name": "user2" } }, { "match": { "cards.tag_categories.tags.is_selected": true } } ] } }, { "bool": { "must": [ { "match": { "cards.tag_categories.tags.name": "user1" } }, { "match": { "cards.tag_categories.tags.is_selected": true } } ] } } ] } } } }, { "term": { "name.keyword": "hello name" } }, { "term": { "title.keyword": "hello title" } } ] } } } 并返回文档。

在上面的示例查询中,应该返回文档user1和user2匹配条件。但它不会发生。

如果我将单个用户与其is_selected值进行比较,则文档将返回。例如:user1。

如果有人能告诉我犯错误的地方,我将感激不尽。

1 个答案:

答案 0 :(得分:0)

我添加了单独的嵌套块,它有效!

{
  "_source": {
  "excludes": ["cards.pages"]
 },
 "query": {
"bool": {
  "must": [{
    "match": {
      "_all": "hello world"
    }
  }],
  "filter": [
    {
      "nested": {
        "path": "cards.tag_categories.tags",
        "query": {
          "bool": {
            "must": [
                {
                  "term": {
                    "cards.tag_categories.tags.name.keyword": "user1"
                  }
                },
                {
                  "term": {
                    "cards.tag_categories.tags.is_selected": true
                  }
                }

            ]
          }
        }
      }
    },
    {
      "nested": {
        "path": "cards.tag_categories.tags",
        "query": {
          "bool": {
            "must": [
                {
                  "term": {
                    "cards.tag_categories.tags.name.keyword": "user2"
                  }
                },
                {
                  "term": {
                    "cards.tag_categories.tags.is_selected": true
                  }
                }

            ]
          }
        }
      }
    },

    {
      "term": {
        "name.keyword": "hello name"
      }
    },
    {
      "term": {
        "title.keyword": "hello title"
      }
    }

  ]
}

} }