Match sur plusieurs valeurs


(Olivier Murciano) #1

Bonjour,

Je suis nouveau sur EL et je travaille a faire des queries EL via un site web.

en parcourant la doc, j'ai trouve le terme TERM pour une recherche d'un terme exact. Si on doit chercher plusiers termes sur un meme champs, on utilise TERMS avec un array en parametre.

Existe t-il la meme chose pour MATCH? C'est a dire utiliser match avec un array.

merci de votre aide


(David Pilato) #2

Quels sont tes documents?
Quelles sont les termes ou phrases sur lesquelles tu souhaites que ca matche (fonctionnellement parlant) ?


(Olivier Murciano) #3

Bonjour,

pour etre bref, j'ai un select de recherche multi-criteres sur mon site> Ce champs correspond a un champs de ma BD EL.
Ce que j'aimerai c'est une fois qu'il a selectionne les valeurs dans le select, il demande a EL de me recherche dans le champs en question en fonction des valeurs selectionnees (quelles soient exactes ou partielles).
Sur une donnee unique, j'arrive a le faire marche avec match, mais des qu'il y en a plusieurs je seche.


(David Pilato) #4

Tu peux faire du bool / should avec une clause match par terme cherché.

Un exemple complet serait plus facile pour répondre.


(Olivier Murciano) #5

voila ma requete si je filtre sur 1 seule valeur pour le match:

query: {
bool: {
must: [
{
match: {
"site.name": "Trans"
}
},
{
terms: {
"status.id": [0,4]
}
}
]
}
}

j'aimerai pouvoir faire une recherche comme terms mais pour site.name


(Christophe Boucaut) #6

Ce que propose David donnerait ceci :

Soit tu veux un "and" entre les critères sur site.name, tu aurais :

"query": {
    "bool": {
        "must": [
            {
                "match": {
                    "site.name": "Trans"
                }
            },
            {
                "match": {
                    "site.name": "Autretruc"
                }
            },
            {
                "terms": {
                    "status.id": [0,4]
                }
            }
        ]
    }
}

Soit tu veux un "or" entre les critères sur site.name, tu aurais :

"query": {
    "bool": {
        "must": [
            {
                "terms": {
                    "status.id": [0,4]
                }
            }
        ],
        "should": [
            {
                "match": {
                    "site.name": "Trans"
                }
            },
            {
                "match": {
                    "site.name": "Autretruc"
                }
            }
        ]
    }
}

Et si jamais tu n'as qu'un critère à chaque fois, tu peux éventuellement les agréger et faire ceci (mais c'est moins sûr/bien que les exemples précédents il me semble) :

"query": {
    "bool": {
        "must": [
            {
                "match": {
                    "site.name": {
                        "query": "Trans Autretruc",
                        "operator": "and" // ou or
                    }
                }
            },
            {
                "terms": {
                    "status.id": [0,4]
                }
            }
        ]
    }
}

Je laisse David confirmer l'idée, je ne suis pas totalement sur du second exemple.

EDIT : Ajout d'un exemple avec filter suite à proposition de David :

"query": {
    "bool": {
        "must": [
            {
                "match": {
                    "site.name": {
                        "query": "Trans Autretruc",
                        "operator": "and" // ou or
                    }
                }
            }
        ],
        filter: [
            {
                "terms": {
                    "status.id": [0,4]
                }
            }
        ]
    }
}

(David Pilato) #7

Oui j'ajoute que faire un filter au lieu d'un must sur les ids est plus efficace sans doute.


(system) #8

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.