web-dev-qa-db-fra.com

Filtre multi-termes Elasticsearch

Je suis assez nouveau sur Elasticsearch, alors voici ma question. Je veux faire une requête de recherche avec elasticsearch et je veux filtrer avec plusieurs termes.

Si je veux rechercher un utilisateur 'tom', je voudrais avoir toutes les correspondances où l'utilisateur 'isActive = 1', 'isPrivate = 0' et 'isOwner = 1'.

Voici ma requête de recherche

"query":{
    "filtered": {
        "query": {
            "query_string": {
                "query":"*tom*",
                "default_operator": "OR",
                "fields": ["username"]
            }
        },
        "filter": {
            "term": { 
                "isActive": "1",
                "isPrivate": "0",
                "isOwner": "1"
            }
        }
    }
}   

Lorsque j'utilise 2 termes, cela fonctionne comme un charme, mais lorsque j'utilise 3 termes, cela ne fonctionne pas.

Merci pour l'aide!!

31

Tu devrais utiliser bool filter à AND tous vos termes:

"query":{
    "filtered": {
        "query": {
            "query_string": {
                "query":"*tom*",
                "default_operator": "OR",
                "fields": ["username"]
            }
        },
        "filter": {
            "bool" : {
                "must" : [
                    {"term" : { "isActive" : "1" } },
                    {"term" : { "isPrivate" : "0" } },
                    {"term" : { "isOwner" : "1" } }
                ]
             }
         }
     }
}   
64
Duc.Duong

Comme le dit l'un des commentaires, la syntaxe a changé dans les versions ES récentes. Si vous utilisez Elasticsearch 6. + et que vous souhaitez utiliser un caractère générique et une séquence de termes dans votre requête (comme dans la question), vous pouvez utiliser quelque chose comme ceci:

GET your_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "your_field_name_1": {
              "value": "tom*"
            }
          }
        },
        {
          "term": {
            "your_field_name_2": {
              "value": "US"
            }
          }
        },
        {
          "term": {
            "your_field_name_3": {
              "value": "Michigan"
            }
          }
        },
        {
          "term": {
            "your_field_name_4": {
              "value": "0"
            }
          }
        }
      ]
    }
  }
}

Aussi, à partir de la documentation sur les requêtes génériques:

Notez que cette requête peut être lente, car elle doit parcourir plusieurs termes. Afin d'éviter des requêtes de caractères génériques extrêmement lentes, un terme de caractère générique ne doit pas commencer par l'un des caractères génériques * ou?.

J'espère que ça aide.

0
Jaime Caffarel