首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在嵌套对象属性上设置不筛选器?

如何在嵌套对象属性上设置不筛选器?
EN

Stack Overflow用户
提问于 2015-08-27 16:53:29
回答 1查看 68关注 0票数 0

我有一份有汽车文件的索引。汽车可以有选择。选项是可以包含可用性对象的嵌套对象。我的地图如下所示:

代码语言:javascript
复制
{
   "car": {
      "properties": {
         "carId": {
            "type": "long"
         },
         "carName": {
            "type": "string",
            "index": "not_analyzed"
         },
         "option": {
            "type": "nested",
            "properties": {
               "optionId": {
                  "type": "long"
               },
               "optionName": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "availability": {
                  "type": "nested",
                  "properties": {
                     "from": {
                        "type": "long"
                     },
                     "to": {
                        "type": "long"
                     }
                  }
               }
            }
         }
      }
   }
}

我索引了以下两个汽车文件。一辆(酷车)有空调选项:

代码语言:javascript
复制
{
   "carId": 100,
   "carName": "cool car",
   "option": {
      "optionId": 10,
      "optionName": "AC",
      "availability": {
         "from": 12345,
         "to": 67890
      }
   }
}

另一辆(不太酷的汽车)没有选择:

代码语言:javascript
复制
{
   "carId": 200,
   "carName": "uncool car"
}

当我搜索一辆带有AC选项的汽车时,我会像预期的那样得到“酷车”:

代码语言:javascript
复制
{
   "query": {
      "nested": {
         "filter": {
            "term": {
               "option.optionId": 10
            }
         },
         "path": "option"
      }
   }
}

现在最大的问题是:我怎么能得到一辆没有空调选项的汽车?我在查询中添加了一个非筛选器,但没有返回任何内容:

代码语言:javascript
复制
{
   "query": {
      "nested": {
         "filter": {
            "not": {
               "filter": {
                  "term": {
                     "option.optionId": 10
                  }
               }
            }
         },
         "path": "option"
      }
   }
}

事先非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-27 17:48:42

我觉得你很接近,但嵌套过滤器的位置搞砸了。我们想要否定嵌套过滤器的结果,而不是从一个被否定的过滤器中找到嵌套文档。

这是我的解决方案:

代码语言:javascript
复制
{
   "filter": {
      "not": {
         "filter": {
            "nested": {
               "path": "option",
               "query": {
                  "filtered": {
                     "filter": {
                        "term": {
                           "option.optionId": 10
                        }
                     }
                  }
               }
            }
         }
      }
   }
}

来自文档:The query path points to the nested object path, and the query (or filter) includes the query that will run on the nested docs matching the direct path

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32255274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档