如何在嵌套对象属性上设置非过滤器?

时间:2015-08-27 16:53:29

标签: elasticsearch

我有一份汽车文件索引。汽车可以选择。选项是可以包含可用性对象的嵌套对象。我的映射看起来像这样:

{
   "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"
                     }
                  }
               }
            }
         }
      }
   }
}

我索引了以下2个汽车文件。 一辆(酷车)带AC选项:

{
   "carId": 100,
   "carName": "cool car",
   "option": {
      "optionId": 10,
      "optionName": "AC",
      "availability": {
         "from": 12345,
         "to": 67890
      }
   }
}

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

{
   "carId": 200,
   "carName": "uncool car"
}

当我搜索带有AC选项的汽车时,我按照预期得到了“酷车”:

{
   "query": {
      "nested": {
         "filter": {
            "term": {
               "option.optionId": 10
            }
         },
         "path": "option"
      }
   }
}

现在最大的问题是:如何才能获得没有AC选项的汽车?我在查询中添加了一个not-filter,但是没有返回任何内容:

{
   "query": {
      "nested": {
         "filter": {
            "not": {
               "filter": {
                  "term": {
                     "option.optionId": 10
                  }
               }
            }
         },
         "path": "option"
      }
   }
}

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

我认为你非常接近,但嵌套过滤器的位置搞砸了。我们想要否定嵌套过滤器的结果,而不是从否定过滤器中找到嵌套文档。

这是我的解决方案:

{
   "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