查找与空值和空值匹配的ElasticSearch记录

时间:2015-06-11 01:54:58

标签: python python-2.7 elasticsearch

我有一些弹性搜索记录存储为空字符串或空值。我正在尝试开发一个允许我从索引中返回这些内容的查询。我提出了:

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

符合我的目的,并返回正确的行。但是,如果我尝试搜索不止一个字段,那么'should'子句或两个字段在一起。这是一个问题,因为我希望有一个AND关系:

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

我是否可以使用单个过滤器完成上述操作,或者将两个过滤器合并在一起?

1 个答案:

答案 0 :(得分:2)

您可以将and filter用于此目的,并使用两个bool/should过滤器,如下所示:

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

或者你也可以bool/must两个or filters这样:

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