带有多个过滤器的ElasticSearch

Mar*_*rah 4 elasticsearch

我正在尝试构建一个查找所有用户文档(docType = user)的查询,然后根据许多过滤器对其进行过滤.例如位置,性别,年龄等.根据我正在构建的搜索功能的用户输入添加/删除过滤器.

下面没有返回结果:

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
             },
             "filter": {
                 "and": {
                     "filters": 
                     [
                         {
                             "term": {
                                 "doc.docType": "user"
                             }
                         },
                         {
                             "term": {
                                 "doc.data.profile.location" : "CA"
                             }
                         }
                     ]
                 }
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

返回结果如下:

{
    "query": {
        "filtered": {
            "query": {
                "field": {
                    "doc.data.profile.location" : "CA"
                }
             },
             "filter": {
                 "and": {
                     "filters": 
                     [
                         {
                             "term": {
                                 "doc.docType": "user"
                             }
                         }
                     ]
                 }
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

后者虽然返回结果,但从长远来看不会起作用,因为我可能想要为年龄,性别等添加额外的过滤器,我似乎无法添加多个字段.如果我删除了位置过滤器,则第一个查询有效.

任何指导帮助非常感谢.

Nat*_*han 7

bool过滤器允许您链接多个MUST,SHOULDSHOULD_NOT一起请求.允许您将其构建为一个查询.

  • 谢谢。如果事实证明这是我所需要的,我会做更多研究并将您的答案标记为已接受:) (2认同)
  • 布尔过滤器现在由布尔查询代替:https://www.elastic.co/guide/zh-cn/elasticsearch/reference/current/query-dsl-bool-query.html (2认同)

小智 7

以下是编写多个过滤器查询的方法

{
  "query": {
    "bool": {
      "filter": [
        {
          "term" : {
            "id":254
          }
        },
        {
          "term" : {
            "cityId":35
          }
        }
      ],
      "must": [
        {
          "match_all": {}
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Alc*_*zar 5

我想你想要的是一个布尔查询

这样,您可以将多个必须链接在一起以获得所需的结果。