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"
}
}
}
}
]
}
}
}'
Дайте мне знать, если это работает. Удачи!