ElasticSearch中的条件查询?

时间:2015-05-12 08:22:24

标签: elasticsearch conditional

我对ElasticSearch比较新,我需要一些建议。 经过几次尝试,我没有找到解决方案,这就是我需要你的原因。

我想根据文档内容进行条件查询。

让我解释一下,我在ES中有这些文件:

{
   "name": "Product n°1",
   "type": "Mail",
   "sub": "Letter"
},
{
   "name": "Product n°2",
   "type": "Video",
   "sub": null
},
{
   "name": "Product n°3",
   "type": "Mail",
   "sub": "Postcard"
}

用户可以按类型进行过滤,也可以使用复选框进行过滤(因此,用户可以同时搜索多个类型和子类)

被修改

客户可以通过复选框选择他们想要从ES获得的产品类型(例如:视频,图像,邮件),他们可以选择所有产品。

"文件" type有4种子类型:Letter,Postal Card,Paper,Printed,他们也可以选择要检索的子类型。

因此,我们承认客户选择了视频和邮件,并将Letter作为邮件的子类型。

我希望ES返回所选类型中的所有文档,当文档是" Mail"时,只返回信件。类型。

对不起我的错误,我对ES很新。

感谢你们所有人的帮助!

更新2

这是我对Andrei Stefan解决方案的疑问

{
  "query": {
    "filtered": {
      "query": {
        "match_all": []
      },
      "filter": {
        "bool": {
          "should": [
            {
              "terms": {
                "type": [
                  "Video",
                  "Mail"
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "type": Mail
                    }
                  },
                  {
                    "terms": {
                      "sub": [
                        "Letters"
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

ES返回Video和Mail类型的所有文档,当类型为Mail时,它不会应用fillter Letters。

1 个答案:

答案 0 :(得分:1)

到安德烈斯特凡的一千辆坦克。更新2之间的区别是我不得不删除" Mail"从第一个"应该"查询。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": []
      },
      "filter": {
        "bool": {
          "should": [
            {
              "terms": {
                "type": [
                  "Video"
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "type": Mail
                    }
                  },
                  {
                    "terms": {
                      "sub": [
                        "Letters"
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}