Elasticsearch 5.4 - фильтровать по термину, если термин существует, и не фильтровать, когда термин отсутствует

Я ищу на нескольких типах. Один из возвращенных типов имеет поле 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 ответа

Решение

Кажется, мне нужно следующее. Документы должны совпадать на "панголине", а документы отфильтровываются на 2 графах. Только 1 из должен соответствовать.

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

Вы пробовали что-то подобное?

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

Дайте мне знать, если это работает. Удачи!

Другие вопросы по тегам