带有且必须的ElasticSearch查询

时间:2019-03-14 11:04:51

标签: elasticsearch

我有这个查询来从AWS ElasticSearch实例v6.2获取数据

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {"logLevel": "error"}
                },
                {
                    "bool": {
                        "should": [
                            {
                            "match": {"EventCategory": "Home Management"}
                            }
                        ]
                    }
                }
            ],
            "filter": [{
            "range": { "timestamp": { "gte": 155254550880 }}    
            }
        ]
        }
    },
    "size": 10,
    "from": 0
}

我的数据具有多个事件类别,例如“家庭管理”和“用户帐户管理”。问题出在should内部,match返回所有数据,因为短语“ Management”属于两个类别。如果我使用term而不是match,即使给定值与文档中的值完全相同,它也不会返回任何内容。

当任何给定类别与其余过滤器匹配时,我需要获取数据。

编辑: 可能没有一个或多个EventCategory传递给should子句

2 个答案:

答案 0 :(得分:1)

我不确定您为什么在STRING_AGG()中添加了select serial_no, STRING_AGG(invoice_no) from t group by serial_no having count(*) >1; 。您是否希望有多个should案例?看起来有点奇怪。

对于您的问题,您不能在已分析的字段上使用must查询,而只能在should类型的字段上使用。如果您的term字段具有默认映射,则可以对keyword的默认未分析多字段运行EventCategory查询,如下所示:

term

此外,如果您只想过滤文档,而又不关心文档的相关性,建议您将EventCategory块中的所有条件都移开,以加快查询速度并改善查询条件使用缓存。

答案 1 :(得分:0)

下面的查询应该可以工作。

我刚刚删除了should,并为mustevent中的每一个创建了两个management子句。请注意,该查询是针对text数据类型的。

{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "term":{  
                  "logLevel":"error"
               }
            },
            {  
               "match":{  
                  "EventCategory":"home"
               }
            },
            {  
               "match":{  
                  "EventCategory":"management"
               }
            }
         ],
         "filter":[  
            {  
               "range":{  
                  "timestamp":{  
                     "gte":155254550880
                  }
               }
            }
         ]
      }
   },
   "size":10,
   "from":0
}

希望有帮助!