Recherche multi index et filtre sur l'index pas l'alias


(Gabriel Tessier) #1

Bonjour,

J'ai des documents comme suit:

index: index_banane_1 (alias index_banane)
type: gros_michel
id: 1
name: tomate
status: private

index: index_ananas_1 (alias index_ananas)
type: gros_michel
id: 1
name: tomate
status: public

(Le nom des index, type et champs ont été modifié pour des raisons de simplification et mettre en avant le problème, en réalité le jeu de donnée est beaucoup plus complexe.)

Je veux rechercher sur tous les index ce qui fait une requête du genre:

/index_banane,index_ananas/_search    
{
"query": {
"bool": {
  "must": [
    {
      "term": {
        "_index": "index_banane"
      }
    },
    {
      "term": {
        "_type": "gros_michel"
      }
    },
    {
      "bool": {
        "must": [
          {
            "bool": {
              "should": [
                {
                  "query_string": {
                    "fields": [
                      "name^10",
                      "name.*^3"
                    ],
                    "default_operator": "AND",
                    "analyzer": "romaji_analyzer",
                    "query": "tom*"
                  }
                },
                ...
              ]
            }
          }
        ]
      }
    },
    {
      "term": {
        "_index": "index_ananas"
      }
    },
    {
      "term": {
        "_type": "gros_michel"
      }
    },
    {
      "bool": {
        "must": [
          {
            "bool": {
              "should": [
                {
                  "query_string": {
                    "fields": [
                      "name^10",
                      "name.*^3"
                    ],
                    "default_operator": "AND",
                    "analyzer": "romaji_analyzer",
                    "query": "tom*"
                  }
                },
                ...
              ]
            }
          }
        ]
      }
    }
  ]
}
}
}

Sauf que ça ne match sur aucun document car mes index sont respectivement index_banane_1 et index_ananas_1 et que mon appli ne connais que les alias. :cry:

Le problème est que si je ne filtre pas sur l'index certains documents vont matcher alors qu'ils devraient pas.

J'ai essayé "prefix" et "wildcard" mais ils retournent tous les deux une erreur si c'est sur le champ _index.

{
  "query": {
    "wildcard": {
    "_index": {
    "value": "index_banane_*"
  }
}
}}

Si quelqu'un peux m'orienter vers une meilleur solution je suis preneur.

Merci d'avance.


(Tanguy) #2

Bonjour,

Il est possible de préciser plusieurs indices (ou alias) ainsi que plusieurs types lors d'une recherche. Tu peux donc faire quelques chose comme ca:

GET / index_banane,index_ananas/gros_michel,petit_michel/_search
{ "query": { "query_string": ... query string sur le champ name...}

A noter que les wildcards sont aussi acceptés, il est aussi possible d'avoir:
GET / index_/_michel/_search


(Gabriel Tessier) #3

Merci pour la réponse mais comme écrit dans mon premier post dans la première requête (la partie qui commence par /index_banane,index_ananas/_search
{)
il y'a déjà plusieurs indices, soit je comprends mal ta réponse soit ma question n'est pas claire.

Je ne cherche pas a faire une recherche sur plusieurs incides, je sais déjà comment faire mais plutôt filtrer sur l'index. Si on lit que le début du titre en effet on peux comprendre que je veux faire un recherche sur plusieurs indices mais dans la suite du titre il est écrit filtrer sur l'index.
J'ai essayé d'expliquer comme je pouvais désolé encore pour mon exemple parler de gros michel peux porter a confusion.

Je requête sur plusieurs index et je voudrais filtrer à l’intérieur de mon "should" sur l'index sachant que "term" ne fonctionne pas car je ne connais que le nom de l'alias.

En tapant ce texte je viens de penser que Je pourrais faire un must avec une query string pour mes champs et une autre pour le champ _index.

Merci @tanguy pour ta réponse qui m'a aidé a trouver une solution, si tu passes a Tokyo je te paye une bière!

Cheers!!!


(system) #4

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