ElasticSearch comment utiliser multi match avec Joker

J'ai l'utilisateur objet avec les propriétés Nom et prénom. Je veux rechercher dans ces champs en utilisant une requête, et j'ai trouvé multi_match dans la documentation, mais je ne sais pas comment l'utiliser correctement avec Joker. Est-il possible?

j'ai essayé avec une requête multi_match mais ça n'a pas marché:

{
    "query": {
        "multi_match": {
            "query": "*mar*",
            "fields": [
                "user.name",
                "user.surname"
            ]
        }
    }
}
33
demandé sur javanna 2013-06-05 11:19:30

4 réponses

vous pouvez aussi utiliser une requête query_string avec des caractères génériques.

"query": {
    "query_string": {
        "query": "*mar*",
        "fields": ["user.name", "user.surname"]
    }
}

ce sera plus lent que d'utiliser un filtre nGram à l'index-temps (Voir mon autre réponse), mais si vous êtes à la recherche d'une solution rapide et sale...

aussi je ne suis pas sûr de votre cartographie, mais si vous utilisez user.name au lieu de name votre cartographie doit ressembler à ceci:

"your_type_name_here": {
    "properties": {
        "user": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string"
                },
                "surname": {
                    "type": "string"
                }
            }
        }
    }
}
55
répondu ramseykhalaf 2013-06-05 08:35:07

une telle requête a fonctionné pour moi:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "should": [
            {"query": {"wildcard": {"user.name": {"value": "*mar*"}}}},
            {"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}}
          ]
        }
      }
    }
  }
}

similaire à ce que vous faites, sauf que dans mon cas, il pourrait y avoir différents masques pour différents domaines.

11
répondu Catherine Tsokur 2015-05-26 17:05:28

je viens de faire ceci maintenant:

GET _search {
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "theDate": {
                            "gte": "2014-01-01",
                            "lte": "2014-12-31"
                        }
                    }
                },
                {
                    "match" : {
                        "Country": "USA"
                    }
                }
            ],
            "should": [
                {
                    "wildcard" : { "Id_A" : "0*" }
                },
                {
                    "wildcard" : { "Id_B" : "0*" }
                }
            ],"minimum_number_should_match": 1
        }
    }
}
6
répondu David Johnson 2015-05-14 21:47:18

Je n'utiliserais pas de caractères génériques, il ne sera pas à bonne échelle. Vous demandez beaucoup de moteur de recherche au moment de la requête. Vous pouvez utiliser le filtre nGram, pour faire le traitement à l'index-time et non à l'Heure de la recherche.

voir cette discussion sur le filtre nGram.

après avoir indexé les name et surname correctement (changer votre mapping, il ya des exemples dans le lien ci-dessus), vous pouvez utiliser multi-match, mais sans jokers et obtenir les résultats attendus.

3
répondu ramseykhalaf 2017-05-23 10:31:15