我有这个查询来从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
子句
答案 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
,并为must
和event
中的每一个创建了两个management
子句。请注意,该查询是针对text
数据类型的。
{
"query":{
"bool":{
"must":[
{
"term":{
"logLevel":"error"
}
},
{
"match":{
"EventCategory":"home"
}
},
{
"match":{
"EventCategory":"management"
}
}
],
"filter":[
{
"range":{
"timestamp":{
"gte":155254550880
}
}
}
]
}
},
"size":10,
"from":0
}
希望有帮助!