Elasticsearch 5.4 - 如果术语存在则按术语过滤,并且在术语不存在时不进行过滤

时间:2017-11-14 05:30:36

标签: python-2.7 elasticsearch elasticsearch-5 elasticsearch-dsl

我正在搜索多种类型。返回的其中一个类型有一个名为my_field的字段。返回的其他类型没有该字段。我希望所有结果都不存在该项,并且只有当该项存在时该字段具有值True的结果。

如果my_field上的过滤器没有对查询得分做出贡献并且只进行过滤,那就太棒了。

这和我一样接近。如果你能帮助我,我会自鞭打1小时。

(不要用它,这是错误的!)

body = {
    'query': {
        'bool': {
            'must': {
                'multi_match': {
                    'query': 'pangolin',
                    'fields': ['_all', '_partials']
                }
            },
            "should": {
                "must_not": {
                    "exists": {
                        "field": "my_field"
                    }
                }
            },
            "should": {
                'term': {
                    'my_field': True
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

你尝试过这样的事吗?

$ curl -XPOST localhost:9200/type1,type2/_search -d '{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "my_field": true
          }
        },
        {
          "constant_score": {
            "filter": {
              "not_missing": {
                "field": "type2.my_field"
              }
            }
          }
        }
      ]
    }
  }
}'

如果有效,请告诉我。祝你好运!

答案 1 :(得分:0)

以下似乎是我需要的。 文件必须与'pangolin'相匹配,文件将在2个文件上过滤。只有一个应该匹配。

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/query-dsl-bool-query.html(请参阅关键字:过滤器和应该)。

body = {
    "query": {
        'bool': {
            'must': {
                'multi_match': {
                    'query': 'pangolin',
                    'fields': ['_all', '_partials']
                }
            },
            "filter": {
                "bool": {
                    "should": [{
                            "term": {
                                "my_field": True
                            }
                        },
                        {
                            "bool": {
                                "must_not": {
                                    "exists": {
                                        "field": "my_field"
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}