2015-06-11 39 views
1

我有一些elasticsearch记录被存储为空字符串或空值。我正在尝试开发一个查询,使我能够从索引中返回这些查询。我想出了:查找匹配空值和空值的ElasticSearch记录

{ 
    'query': { 
     'filtered': { 
      'filter': { 
       'bool': { 
        'should': [ 
         {'term': {'field1': ''}}, 
         {"missing" : {"field": "field1"}}, 
        ], 
       } 
      } 
     } 
    } 
} 

这对我的目的按预期工作,并返回正确的行。但是,如果我尝试搜索任何不止一个字段,那么“应该”子句OR将这两个字段放在一起。这是一个问题,因为我希望这是一个与关系:

{ 
    'query': { 
     'filtered': { 
      'filter': { 
       'bool': { 
        'should': [ 
         {'term': {'field1': ''}}, 
         {"missing" : {"field": "field1"}}, 
         # these fields should be AND but are OR 
         {'term': {'field2': ''}}, 
         {"missing" : {"field": "field2"}}, 
        ], 
       } 
      } 
     } 
    } 
} 

反正是有,我可以做上面一个过滤器,或与两个过滤器一起?

回答

2

您可以使用and filter为此目的,并和两个bool/should过滤器,像这样:

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "and": [ 
      { 
      "bool": { 
       "should": [ 
       { 
        "term": { 
        "field1": "" 
        } 
       }, 
       { 
        "missing": { 
        "field": "field1" 
        } 
       } 
       ] 
      } 
      }, 
      { 
      "bool": { 
       "should": [ 
       { 
        "term": { 
        "field2": "" 
        } 
       }, 
       { 
        "missing": { 
        "field": "field2" 
        } 
       } 
       ] 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

或者你也可以这样的:

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "or": [ 
       { 
        "term": { 
        "field1": "" 
        } 
       }, 
       { 
        "missing": { 
        "field": "field1" 
        } 
       } 
       ] 
      }, 
      { 
       "or": [ 
       { 
        "term": { 
        "field2": "" 
        } 
       }, 
       { 
        "missing": { 
        "field": "field2" 
        } 
       } 
       ] 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

谢谢你,这解决了我的问题。 – stephens

+0

我很好奇你选择了哪个选项。 – Val

+0

第一个。这似乎最适合我的使用案例和施工方法。 – stephens