aucune [requête] enregistrée pour [filtrée]

108

J'ai une requête dont j'ai besoin pour filtrer les résultats.

Ceci est ma requête

{
    "query": {
        "filtered": {
            "query": {
                "multi_match": {
                    "default_operator": "AND",
                    "fields": [
                        "author",
                        "title",
                        "publisher",
                        "year"
                    ],
                    "query": "George Orwell"
                }
            },
            "filter": {
                "terms": {
                    "year": [
                        1980,
                        1981
                    ]
                }
            }
        }
    }
}

Je reçois une erreur disant no [query] registered for [filtered]. J'ai clairement une requête pour le champ filtré. Je suis le format donné dans la documentation des requêtes filtrées sur la page elasticsearch. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html

devxeq
la source

Réponses:

185

La filteredrequête est obsolète et supprimée dans ES 5.0. Vous devez maintenant utiliser la bool/must/filterrequête à la place.

{
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "operator": "and",
                    "fields": [
                        "author",
                        "title",
                        "publisher",
                        "year"
                    ],
                    "query": "George Orwell"
                }
            },
            "filter": {
                "terms": {
                    "year": [
                        1980,
                        1981
                    ]
                }
            }
        }
    }
}

Voici les différences entre les deux requêtes:

3,4c3,4
<         "bool": {
<             "must": {
---
>         "filtered": {
>             "query": {
6c6
<                     "operator": "and",
---
>                     "default_operator": "AND",

PS: la page de référence que vous regardez se trouve dans les "pages supprimées" de l'annexe, elle ne fait donc plus partie de la documentation principale.

Val
la source
4
Lors de l'utilisation de la version 5.5, il semble que default_operator a été supprimé de la requête multi_match ainsi que val, il vaut peut-être la peine de mettre à jour cette réponse car cela m'a conduit sur la mauvaise route en supposant que ce qui précède allait fonctionner.J'ai modifié la requête pour qu'elle corresponde à mes champs pour ensuite le réaliser n'a pas fonctionné! C'était une solution simple pour moi, mais simplement en supprimant l'opérateur par défaut, mais cela vaut peut-être la peine d'être modifié pour les futurs lecteurs. L'erreur est: [multi_match] la requête ne prend pas en charge [default_operator]
Birdy
3
@Birdy en fait le paramètre est nommé operatoret non default_operator, j'ai modifié ma réponse, désolé à ce sujet.
Val
Val - Si vous avez une minute, pourriez-vous m'aider s'il vous plaît sur un problème de logstash, je me suis cogné la tête de la table pendant plus de 48 heures haha ​​et je sais que vous êtes un expert dans le domaine qui pourrait aider à sauver la journée haha, Merci, je serais toujours endetté si vous le pouviez !! stackoverflow.com/questions/45577572/…
Birdy
Merci, cela a fonctionné pour moi lors de la mise à niveau d'une instance ES5.1 vers 7.1
jhob101