ElasticSearch嵌套[AND OR]过滤器

时间:2014-05-13 14:53:33

标签: elasticsearch

我有一个我在ElasticSearch中苦苦挣扎的问题。事实上,我有两个问题,第一个工作,但第二个没有。

这是基本的第一个查询,这很好(查询实际上比这个要大得多,我为了便于理解而将其剥离了):

{
    "query": {
        "filtered": {
            "query": {
                "match_all":{}
            },
            "filter": {
                "and": [{
                    "term":{
                        "relatedID":"214"
                    }
                },
                {
                    "term":{
                        "relatedType":"deal"
                    }
                }]
            }
        }
    }
}

所以基本上,抓住所有相关项ID == 214&& relatedType ==" deal"

然而,我也想做的是:

{
    "query": {
        "filtered": {
            "query": {
                "match_all":{}
            },
            "filter": {
                "and": [{
                    {
                        "or":[{
                                "and":[{
                                    "relatedID":"528"
                                },
                                {
                                    "relatedType":"company"
                                 }]
                            },{
                                "and":[{
                                    "relatedID":"214"
                                 },
                                 {
                                    "relatedType":"deal"
                                  }
                                  ]}
                             ]}
                        ]}
                    }
                }                
            }
        }
    }
}

所以基本上,抓住所有交易AND 214或公司AND 528。

这就是我似乎陷入困境的地方。

正如我所说,查询中还有更多内容(请参阅下面的完整查询,这可能有助于理解我为什么尝试在上面构建它):

{
"query":{
    "filtered":{
        "query":{
            "match_all":{}
         },
         "filter":{
            "and":[
                {
                    "or":[
                        {
                            "term":{
                                "timeSensitive":false
                            }
                        }
                        ,
                        {
                            "range":{
                                "validTo":{
                                    "gt":"20140513T153030Z"
                                 },
                                 "validFrom":{
                                    "lt":"20140513T153030Z"
                                 }
                            }
                        }
                        ]
                    }
                    ,
                    {
                        "term":{
                            "categoryTree.NAME":"Promotions"
                         }
                     }
                     ,
                     {
                        "or":[
                            {
                                "and":[
                                    {
                                        "relatedID":"528"
                                    }
                                    ,
                                    {
                                        "relatedType":"company"
                                    }
                                ]
                            }
                            ,
                            {
                                "and":[
                                    {
                                        "relatedID":"214"
                                    }
                                    ,
                                    {
                                        "relatedType":"deal"
                                     }
                                  ]
                             }
                         ]
                     }
                     ,
                     {
                        "terms":{
                            "permissions": ["member","supplier"]
                        }
                     }
                     ,
                     {
                        "term":{
                            "siteID":6
                         }
                      }
                   ]
                }
             }
          }
       }
   }

}

1 个答案:

答案 0 :(得分:3)

它的语法错误。问题是你没有在内部(和,或)过滤器中提到术语过滤器。

尝试使用布尔过滤器并查询它比(和/或)过滤器更快。

[AND OR]过滤

{
"query": {
  "filtered": {
     "query": {
        "match_all": {}
     },
     "filter": {
        "and": [
           {
              "or": [
                 {
                    "and": [
                       {
                          "term": {
                             "relatedID": "528"
                          }
                       },
                       {
                          "term": {
                             "relatedType": "company"
                          }
                       }
                    ]
                 },
                 {
                    "and": [
                       {
                          "term": {
                             "relatedID": "214"
                          }
                       },
                       {
                          "term": {
                             "relatedType": "deal"
                          }
                       }
                    ]
                 }
              ]
           }
        ]
     }
   }
   }
  }

同一个查询我转换为bool过滤器

curl -XPOST "http://localhost:9200/try/_search" -d'
{
"query": {
"filtered": {
   "query": {
   "match_all": {}
   },
   "filter": {
       "bool": {
           "should": [
              {
                  "bool": {
                      "must": [
                         {
                             "term": {
                                "relatedID":"528"
                             }
                         },
                          {
                             "term": {
                                "relatedType":"company"
                             }
                         }
                      ]
                  }
              },
              {
                  "bool": {
                      "must": [
                         {
                             "term": {
                                "relatedID":"214"
                             }
                         },
                          {
                             "term": {
                                "relatedType":"deal"
                             }
                         }
                      ]
                  }
              }
           ]
       }
   }
}
}
}'