Elasticsearch嵌套查询的可用值在范围内



尝试为以下文档构建查询:

{
"name" : "Bob",
"grades" : [
{
"year" : 2010,
"grade": 8,  
},
{
"year" : 2018,
"grade": 7,  
},
{
"year" : 2019,
"grade": 4,  
}
]
},
{
"name" : "Alice",
"grades" : [
{ 
"year" : 2005,
"grade": 3,  
},
{
"year" : 2016,
"grade": 8,  
},
{
"year" : 2018,
"grade": 7,  
},
{
"year" : 2019,
"grade": 6,  
}
]
}

我有一系列的年份,例如从2010年到2020年。如果在范围(从2010年到2020年(内的所有可用年份(在文档中(,等级>5.如果存在等级<=5在感兴趣的年份范围之外,我们不在乎,也不应该以任何方式影响最终结果。所以基本上只应该返回带有Alice的文档。在查看了Elasticsearch文档后,找不到解决方案(很可能我只是错过了什么(。如果年份没有间隔,我可以构造一个查询,但在我的情况下,存在间隔。所以我的查询只是删除了这样的文档。当前查询:

{
"query": {
"bool": {
"must": [
{
"nested": {
"query": {
"bool": {
"must": [
{
"term": {
"grades.year": {"value": 2010}
}
},
{
"range": {
"grades.grade": {"from": 5}
}
}
]
}
},
"path": "grades"
}
},
{
"nested": {
"query": {
"bool": {
"must": [
{
"term": {
"grades.year": {"value": 2011}
}
},
{
"range": {
"grades.grade": {"from": 5}
}
}
]
}
},
"path": "grades"
}
},
....
]
}
}
}

也许我肯定错过了什么。有可能吗?

更新

我在爱丽丝的成绩中加了2005年的三年级。所以现在爱丽丝仍然应该匹配,因为2005年超出了感兴趣的范围。

谢谢!

您可以使用must_not子句,该子句将排除所有级别小于或等于5的文档

搜索查询:

{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "grades",
"query": {
"bool": {
"must": [
{
"range": {
"grades.year": {
"gte": 2010,
"lte": 2020
}
}
}
]
}
}
}
}
],
"must_not": {
"nested": {
"path": "grades",
"query": {
"bool": {
"must": [
{
"range": {
"grades.grade": {
"lte": 5
}
}
}
]
}
}
}
}
}
}
}

搜索结果:

"hits": [
{
"_index": "64882747",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "Alice",
"grades": [
{
"year": 2016,
"grade": 8
},
{
"year": 2018,
"grade": 7
},
{
"year": 2019,
"grade": 6
}
]
}
}
]

看来我找到了解决方案!感谢@Bhavya指导我。基本上还有一些额外的布尔逻辑。我最终得到了以下查询:

{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "grades",
"query": {
"bool": {
"must": [
{
"range": {
"grades.year": {
"gte": 2010,
"lte": 2020
}
}
}
]
}
}
}
}
],
"must_not":   {
"nested": {
"path": "grades",
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"grades.year": {
"value": 2010
}
}
},
{
"range": {
"grades.grade": {
"lte": 5
}
}
}
]
}
},
...
...
...
...
...
]
}
}
}
}
}
}
}

最新更新